根据另一列删除列的所有值相同的行

时间:2018-03-21 14:01:53

标签: r

我有一个这样的数据框:

id    info
1     0
1     0
2     0
2     10
3     20
3     20

我想删除所有“信息”中没有变化的“id”的行,也就是说,删除所有“info”对于某个“id”都相同的行。

对于上面的例子,我最终会:

id    info
2     0
2     10

3 个答案:

答案 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