如何基于另一个对称数据帧在R中创建对称数据帧

时间:2019-04-16 21:08:10

标签: r dataframe lookup

我有这个数据框。

df <- data.frame(product=c("A", "B", "C", "D", "E"), ID=c(1,1,2,2,1))

enter image description here

和另一个(对称)数据帧。

ID_table <- data.frame("ID 1" = c(10, 50), "ID 2" = c(50, 10))

enter image description here

如何根据ID的值创建5 x 5产品级数据框?

这是所需的输出:

enter image description here

从A到B的数字是10,因为A和B具有相同的ID = 1。 从A到C的数字为50,因为A的ID为1,而C的ID为2。

2 个答案:

答案 0 :(得分:3)

您可以使用tabletcrossprod获得以下内容

out <- tcrossprod(table(df))
out
#       product
#product A B C D E
#      A 1 1 0 0 1
#      B 1 1 0 0 1
#      C 0 0 1 1 0
#      D 0 0 1 1 0
#      E 1 1 0 0 1

现在,您只需将值替换为1050

as.data.frame(ifelse(out == 1, 10, 50))
#   A  B  C  D  E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10

table(df)的结果是

table(df)
#       ID
#product 1 2
#      A 1 0
#      B 1 0
#      C 0 1
#      D 0 1
#      E 1 0

tcrossprod(table(df))的结果与操作相同

table(df) %*% t(table(df))

答案 1 :(得分:2)

Here's an attempt using outer to generate the combinations of each df$ID and use them to subset your ID_table:

idnm <- setNames(df$ID,df$product)
o <- outer(idnm, idnm, FUN=function(x,y) ID_table[cbind(x,y)] )
o
#   A  B  C  D  E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10