我有一个数据集,我需要根据另一列中的值有条件地删除重复的行。
具体来说,我需要删除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
请注意实际数据集非常大,所以我不想找到一种只按行号删除已知行的方法。
答案 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_by
和filter
来做到这一点:
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
。
希望有所帮助