有条件地删除R中的重复项

时间:2017-09-08 14:55:13

标签: r duplicates conditional

我有一个数据集,我需要根据另一列中的值有条件地删除重复的行。

具体来说,我需要删除size = 0 IF的任何行(并且只有在复制SampleID时才会删除。

SampleID<-c("a", "a", "b", "b", "b", "c", "d", "d", "e")
size<-c(0, 1, 1, 2, 3, 0, 0, 1, 0)
data<-data.frame(SampleID, size)

I want to delete rows with:
Sample ID   size
a           0
d           0

And keep:
SampleID   size
a          1
b          1
b          2
b          3
c          0
d          1
e          0

请注意实际数据集非常大,所以我不想找到一种只按行号删除已知行的方法。

3 个答案:

答案 0 :(得分:1)

在没有data.table的基础R中运行的解决方案,并且很容易为R启动器提供:

#Find all duplicates

data$dup1 <- duplicated(data$SampleID)
data$dup2 <- duplicated(data$SampleID, fromLast = TRUE)
data$dup <- ifelse(data$dup1 == TRUE | data$dup2 == TRUE, 1, 0)


#Subset to relevant

data$drop <- ifelse(data$dup == 1 & data$size == 0, 1, 0)
data2 <- subset(data, drop == 0)

答案 1 :(得分:1)

dplyr中,我们可以使用group_byfilter来做到这一点:

library(dplyr)

data %>% 
  group_by(SampleID) %>% 
  filter(!(size==0 & n() > 1)) # filter(size!=0 | n() == 1)) 
#> # A tibble: 7 x 2
#> # Groups:   SampleID [5]
#>   SampleID  size
#>   <fct>    <dbl>
#> 1 a            1
#> 2 b            1
#> 3 b            2
#> 4 b            3
#> 5 c            0
#> 6 d            1
#> 7 e            0

答案 2 :(得分:0)

使用data.table框架:将您的设置转换为data.table

require(data.table)
setDT(data)

建立一个我可以删除行的id列表:

dropable_ids = unique(data[size != 0, SampleID])

最后保留不在可删除列表中或非0值

的行
data = data[!(SampleID %in% dropable_ids & size == 0), ]

请注意,not( a and b )等同于a or b,但data.table框架处理不当or

希望有所帮助