我有这个数据框:
data.frame(Name = c("A", "B"), Value = c(1,2))
我希望得到一个矩阵,其中Name值作为矩阵的行名称和列名称,值作为减法的乘积,如下所示
Name
又名
uinbv5nw1#
我假设你想用矩阵运算来完成它,所以我做了以下工作。
dd <- data.frame(Name = c("A", "B"), Value = c(1,2)) M <- matrix( dd$Value, 2,2, dimnames=list( dd$Name, dd$Name)) M # A B #A 1 1 $B 2 2 M - t(M) # A B #A 0 -1 #B 1 0
ycggw6v22#
您可以使用函数outer-
outer
df <- data.frame(Name = c("A", "B"), Value = c(1,2)) mat <- t(outer(df$Value, df$Value, `-`)) dimnames(mat) <- list(df$Name, df$Name) mat # A B #A 0 1 #B -1 0
hpcdzsge3#
这不是公平吗?
col(df) - df$value [,1] [,2] [1,] 0 1 [2,] -1 0 with(df, structure(col(df) - value, .Dimnames = list(name, name))) A B A 0 1 B -1 0
7tofc5zh4#
使用col()进行索引的替代方法:
col()
mat <- array(df$Value, rep(nrow(df), 2), dimnames = list(df$Name, df$Name)) df$Value[col(mat)] - mat # A B # A 0 1 # B -1 0
elcex8rz5#
tidyverse解决方案:
df <- data.frame(name = c("A", "B"), value = c(1,2)) df |> bind_cols(df |> pivot_wider()) |> transmute(across(A:B, \(x) x - value)) A B 1 0 1 2 -1 0
name
value
pivot_wider()
names_from
values_from
例如:pivot_wider(names_from = 'Name', values_from = "Value")。
pivot_wider(names_from = 'Name', values_from = "Value")
5条答案
按热度按时间uinbv5nw1#
我假设你想用矩阵运算来完成它,所以我做了以下工作。
ycggw6v22#
您可以使用函数
outer
-hpcdzsge3#
这不是公平吗?
7tofc5zh4#
使用
col()
进行索引的替代方法:elcex8rz5#
tidyverse解决方案:
name
和value
在本例中是小写的。如果它们是大写的,或者如果有其他列名,请在pivot_wider()
中使用names_from
和values_from
参数。例如:
pivot_wider(names_from = 'Name', values_from = "Value")
。