我有这个数据框。
df <- data.frame(product=c("A", "B", "C", "D", "E"), ID=c(1,1,2,2,1))
和另一个(对称)数据帧。
ID_table <- data.frame("ID 1" = c(10, 50), "ID 2" = c(50, 10))
如何根据ID的值创建5 x 5产品级数据框?
这是所需的输出:
从A到B的数字是10,因为A和B具有相同的ID = 1。 从A到C的数字为50,因为A的ID为1,而C的ID为2。
答案 0 :(得分:3)
您可以使用table
和tcrossprod
获得以下内容
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
现在,您只需将值替换为10
和50
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