想象一下,我有两个数据框,'第一'和'第二':
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行,则会从两个数据帧中删除该组。
非常感谢您的帮助。
答案 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,]