【发布时间】:2016-10-11 21:47:30
【问题描述】:
我会尽力解释我在做什么,这有点令人困惑,但我会试一试。基本上我从 2 个数据帧开始。每个包含每个人唯一的行和每个用户两个项目作为列。我的目标是将其转换为 1 个数据框,每个用户有一个唯一行,并且在项目不重复的情况下,这两个数据框中的第一个项目。例如,如果对于第一个数据框中的客户 1,他的项目是“a”和“d”,而在第二个数据框中,他的项目是“a”和“c”,我希望最终数据框是“a”和“c”代表这个客户。我已经编写了一个应用程序来执行此操作,但是当我在大约 160,000 行上执行此操作时,它需要相当多的时间。我希望有人能够为我的问题提出更有效的解决方案。
d1 <- data.frame(id = c("1", "2", "3"), stringsAsFactors = F)
r1 <- data.frame(i1 = c("a", "b", "c"), i2 = c("d", "e", "f"), stringsAsFactors = F)
rownames(r1) = d1$id
r2 <- data.frame(i1 = c("a", "c", "f"), i2 = c("c", "t", "l"), stringsAsFactors = F)
rownames(r2) = d1$id
dFinal <- data.frame(id = d1$id, r1 = "", r2 = "", stringsAsFactors = F)
dFinal$r1 = apply(dFinal, 1, function(x){r1[rownames(r1) == x["id"], "i1"]})
dFinal$r2 = apply(dFinal, 1, function(x){r2[rownames(r2) == x["id"], which(!r2[rownames(r2) == x["id"],c("i1","i2")] %in% x["r1"])[1]]})
【问题讨论】:
-
嗯,我可以看到合并工作,但是我不确定合并的一个部分是如何在合并后选择正确的列。假设 r1 和 r2 将 id 作为列而不是行名。
dInter <- merge(r1,r2, by = "id")但是我不知道如何从只选择正确列的应用中复制逻辑 -
在你的例子中,为什么是 a 和 c 而不是 a 和 d?还有其他标准吗?
-
@Parfait 我想从每个数据帧中取出前一个数据帧中不存在的第一个可用列。因此,从第一个数据框中选择第一列 a 然后对于第二个数据框中的相同 id 选择 a 和 c,由于 a 已用于第一个数据帧,因此选择 c。