【发布时间】:2017-02-17 11:25:25
【问题描述】:
我的问题是关于构建“combn by”函数之类的快速有效方法,并结合合并两个数据集的问题。我的数据大致是这样的:
DF <- data.frame(c(1, 1, 1, 2), c("A", "B", "C", "A"))
colnames(DF) <- c("ID", "Classification")
DF
ID Classification
1 1 A
2 1 B
3 1 C
4 2 A
M <- matrix(data=c(1, 2, 3, 2, 4, 5, 3, 5, 6), nrow=3, ncol=3)
colnames(M) <- c("A", "B", "C")
rownames(M) <- c("A", "B", "C")
M
A B C
A 1 4 7
B 2 5 8
C 3 6 9
我最终想要的结果是这样的(有没有还包括Classification1和Classification2变量,我不在乎):
RESULT <- data.frame(c(1, 1, 1, 1, 1, 1, 2), c("A", "A", "A", "B", "B", "C", "A"),
c("A", "B", "C", "B", "C", "C", NA), c(1, 2, 3, 4, 5, 6, NA))
colnames(RESULT) <- c("ID", "Classification1", "Classification2", "Value")
RESULT
ID Classification1 Classification2 Value
1 1 A A 1
2 1 A B 2
3 1 A C 3
4 1 B B 4
5 1 B C 5
6 1 C C 6
7 2 A <NA> NA
所以本质上我想告诉 R 类似:对于 ID 的每个唯一值,创建 Classification 中因子的所有可能的二进制组合,对于这些可能的组合中的每一个,在矩阵中查找相应的值M,返回一个data.frame,其中包含ID 的列和values 的相应列表。
我尝试在第一部分基于expand.grid 或combn 编写自己的函数,然后将melt 矩阵M 转换为长格式,并基于Classification 变量编写merge .这需要很多subset、merge,然后又是rbind,所以花了太长时间。我尝试使用lapply,我似乎无法做到这一点。我的感觉是data.table 可能有一个聪明的方法,但我也无法做到这一点。
非常感谢任何帮助。
尼尔斯
【问题讨论】:
标签: r