我有两个表,其中一行比另一行多。我想过滤两个表共享的行。我尝试了提出的解决方案here。
然而,问题在于它是一个大型数据集,并且计算需要相当长的时间。有没有简单的解决方案?我知道如何使用以下方法提取两个表的共享行:
rownames(x1)->k
rownames(x)->l
which(rownames(x1)%in%l)->o
这里x1和x是我的数据帧。但这只为我提供了共享行。如何获取每个表的唯一行,然后分别将它们排除?这样我可以把两张桌子放在一起吗?
答案 0 :(得分:2)
(我编辑整个答案)
您可以将df与merge()
合并(来自Andrie的评论)。另请检查?merge
以了解您可以将by
参数0 = row.names
放入的所有选项。
下面的代码显示了一个可能是您的数据框(不同行数和列数)的示例
x = data.frame(a1 = c(1,1,1,1,1), a2 = c(0,1,1,0,0), a3 = c(1,0,2,0,0), row.names = c('y1','y2','y3','y4','y5'))
x1 = data.frame(a4 = c(1,1,1,1), a5 = c(0,1,0,0), row.names = c('y1','y3','y4','y5'))
如果行名称可以用作标识符,那么我们将它们作为新列放入以按列合并:
x$id <- row.names(x)
x1$id <- row.names(x1)
# merge by column names
merge(x, x1, by = intersect(names(x), names(x1)))
# result
# id a1 a2 a3 a4 a5
# 1 y1 1 0 1 1 0
# 2 y3 1 1 2 1 1
# 3 y4 1 0 0 1 0
# 4 y5 1 0 0 1 0
我希望这能解决问题。
编辑:好的,现在我觉得很傻。如果所有列在两个数据框中都有不同的名称,则不需要将行名称作为另一列。只需使用:
merge(x,x1, by=0)
答案 1 :(得分:0)
如果您只想要从每个数据集中重复的行:
rownames(x1)->k
rownames(x)->l
which(k%in%l) -> o
x1.uniq <- x1[k[k != o],];
x.uniq <- x[l[l != o],];
然后你可以用rbind加入他们:
x2 <- rbind(x1.uniq,x.uniq);
如果您还想要重复的行,可以添加它们:
x.repeated <- x1[o];
x2 <- rbind(x2,x.repeated);