将R中的两个data.frames组合在一起,具有不同的行

时间:2012-07-26 09:42:59

标签: r merge

我有两个表,其中一行比另一行多。我想过滤两个表共享的行。我尝试了提出的解决方案here

然而,问题在于它是一个大型数据集,并且计算需要相当长的时间。有没有简单的解决方案?我知道如何使用以下方法提取两个表的共享行:

rownames(x1)->k
rownames(x)->l
which(rownames(x1)%in%l)->o

这里x1和x是我的数据帧。但这只为我提供了共享行。如何获取每个表的唯一行,然后分别将它们排除?这样我可以把两张桌子放在一起吗?

2 个答案:

答案 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);