2

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

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 行,它们就会从两个数据帧中删除该组。

非常感谢您的帮助。

4

2 回答 2

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唯一的,因为对于下一个连接操作没有关系。

于 2013-05-23T21:04:26.550 回答
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,]
于 2013-05-23T21:00:19.720 回答