我有一个这样的数据框:
id info
1 0
1 0
2 0
2 10
3 20
3 20
我想删除所有“信息”中没有变化的“id”的行,也就是说,删除所有“info”对于某个“id”都相同的行。
对于上面的例子,我最终会:
id info
2 0
2 10
答案 0 :(得分:3)
基础R解决方案,
df[!with(df, ave(info, id, FUN = function(i)var(i) == 0)),]
#slightly different syntax (as per @lmo)
#df[ave(df$info, df$id, FUN=var) > 0,]
给出,
id info 3 2 0 4 2 10
答案 1 :(得分:2)
以下是data.table
的解决方案:
library("data.table")
DT <- fread(
"id info
1 0
1 0
2 0
2 10
3 20
3 20")
DT[, .N, .(id, info)][N==1, .(id, info)]
# > DT[, .N, .(id, info)][N==1, .(id, info)]
# id info
# 1: 2 0
# 2: 2 10
变种:
DT[, if (.N==1) TRUE, .(id, info)][, .(id, info)]
以下是使用反连接的解决方案:
DT[!DT[duplicated(DT)], on=names(DT)]
答案 2 :(得分:-1)
使用data.table
魔术变量的另一个.SD
解决方案。
df <- data.table(id = c(1,1,2,2,3,3), info=c(0,0,0,10,20,20))
df[,.SD[uniqueN(.SD)>1],id]
id info
1: 2 0
2: 2 10