从r中的 Dataframe 创建对角矩阵

uajslkp6  于 2023-03-05  发布在  其他
关注(0)|答案(5)|浏览(145)

我有这个数据框:

data.frame(Name = c("A", "B"), 
           Value = c(1,2))

我希望得到一个矩阵,其中Name值作为矩阵的行名称和列名称,值作为减法的乘积,如下所示

又名

uinbv5nw

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
ycggw6v2

ycggw6v22#

您可以使用函数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
hpcdzsge

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
7tofc5zh

7tofc5zh4#

使用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
elcex8rz

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
  • 注意namevalue在本例中是小写的。如果它们是大写的,或者如果有其他列名,请在pivot_wider()中使用names_fromvalues_from参数。

例如:pivot_wider(names_from = 'Name', values_from = "Value")

相关问题