2012-07-26 72 views
3

我有两个表格,其中一行的行数多于另一个。我想筛选出两个表共享的行。我尝试了解决方案here将R中的两个data.frames与不同的行结合使用

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

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

这里x1和x是我的数据帧。但是这只能为我提供共享的行。我如何获得每个表的唯一行然后分别排除它们?所以我可以将两个表拼在一起?

+4

您是否已经尝试“合并()”这些数据帧?另外,如果数据帧很大,可以使用package'data.table'来执行非常快速的连接操作。 – Andrie 2012-07-26 09:45:24

+0

您可以尝试一个shell脚本,例如:将一个放在另一个之上,“排序”,然后是“uniq -d”。 – DiscreteCircle 2012-07-26 09:51:55

+0

你已经有共享行的rownames,你问如何提取这些行? – JackeJR 2012-07-26 09:52:07

回答

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); 
+0

嘿..你的答案真的很好。但是,有一个问题,我输入 x1.uniq < - x1 [k [k!= o],]; x.uniq < - x [l [l!= o],]; 有警告“,在K = 0:较长的对象长度不短对象长度的倍数而当我进入 X2 < - rbind(x1.uniq,x.uniq); 它提出了一个错误! (矩阵的列数必须匹配) – 2012-07-27 08:30:07

+0

我假定您有两个具有相同列属性但行重叠的数据集,您能澄清一下您的数据集的外观吗? – DiscreteCircle 2012-07-27 12:38:30

+0

因此数据集的行号不同,但包含一些重叠 - 例如数据集1有50行,2有40行,其中共有30行。数据集有4个列,数据集2有10列 – 2012-07-27 20:37:21

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

嘿,thansk的答复。该解决方案听起来很简单,但是......你在编辑帖子中意味着什么?这两个数据帧具有不同的列数。那么他们为什么成倍增长?那么你的意思是,如果x1帽子5和x有4列,新的合并表格不会有9但是18? – 2012-07-27 08:41:25

+0

有什么办法来保存使用合并时的初始标识符列?所以我的初始表中的第一列是与rownames的第一列,但只要我合并了两个表,只有从1到n的数字在第一列,而标识符在第二列 – 2012-07-27 11:57:45

+0

我想如果不是合并'row.names'使用某种id作为列而不是行的名称(请参阅edit2) – julia 2012-07-30 12:14:15

相关问题