R:如果数据帧1和数据帧2中的行不满足条件,则删除两个数据帧中的行

时间:2013-05-23 20:44:33

标签: r

想象一下,我有两个数据框,'第一'和'第二':

x = c(12,14,11,15,10)
y = c(25,22,20,21,23)
id = c(1,1,1,2,2)
first = data.frame(x,y,id)
x1 = c(32,34,31,35,30)
y1 = c(45,42,40,41,43)
id1 = c(1,1,1,1,2)
second = data.frame(x1,y1,id1)
colnames(second) <- c("x", "y", "id")

这里'id'表示组号。在这个例子中,我希望能够通过'id'计算行数。如果任一数据帧中给定'id'的行数小于2,那么我想从两个数据帧中删除这些行。

换句话说,如果任何组的行数少于2行,则会从两个数据帧中删除该组。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

以下是使用data.table

执行此操作的方法
library(data.table)
dt1 = data.table(first, key = 'id')
dt2 = data.table(second, key = 'id')

throw.away.ids = c(dt1[, .N < 2, by = id][(V1), id],
                   dt2[, .N < 2, by = id][(V1), id])

dt1[!J(throw.away.ids)]
dt2[!J(throw.away.ids)]

我过滤了需要从两个数据集中获取的所有ID,然后将它们组合在一起并将其过滤掉。请注意,我没有throw.away.ids唯一,因为它对下一次加入操作并不重要。

答案 1 :(得分:0)

以下代码可以解决问题:

id.first = unique(first$id)
id.second = unique(second$id)
ids = NULL
for(i in unique(first$id)){
    if(i %in% id.second && sum(first$id == i) >= 2 && sum(second$id == i) >= 2){
      ids = c(ids, i)
    } 
}
first = first[first$id %in% ids,]
second = second[second$id %in% ids,]