首页 > 解决方案 > 如何基于另一个对称数据框在 R 中创建对称数据框

问题描述

我有这个数据框。

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。

标签: rdataframelookup

解决方案


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

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

现在您只需要将值替换为10and50

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

推荐阅读