R:如果可以在其他行中找到特定值,则删除行
R: remove row if certain value can be found in other row
我使用一个数据集,如果标签为 1 并且有一个标签为 3 的 ID 号,我想删除一行。编辑:标签值只能是:NA、1、2 或 3。 id 号是不同的,如果存在标签 1、标签 2 和标签 3,则只能找到三次。
> dat1 = data.frame(id=c(15399,15404,15405,15407,15407,15407,15403), tag=c(NA,NA,1,1,2,3,1))
> dat1
id tag
1 15399 NA
2 15404 NA
3 15405 1
4 15407 1
5 15407 2
6 15407 3
7 15403 1
我需要return这个:
> dat1
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1
有人可以帮助我吗?我只知道如何删除标签为 3:
的所有 ID
> subset(dat1,!dat1$id %in% dat1$id[dat1$tag == 3])
id tag
1 15399 NA
2 15404 NA
3 15405 1
7 15403 1
我们可以用 data.table
library(data.table)
setDT(dat1)[, .SD[any(tag != 1) & tag !=1 | all(tag==1) |is.na(tag)] , by = id]
# id tag
#1: 15399 NA
#2: 15404 NA
#3: 15405 1
#4: 15407 2
#5: 15407 3
#6: 15403 1
如果条件是删除 'tag' 为 1 的行,其中对于特定 'id' 也有 'tag' 3,则
setDT(dat1)[, .SD[!(all(c(1,3) %in% tag) & tag == 1)] , id]
# id tag
#1: 15399 NA
#2: 15404 NA
#3: 15405 1
#4: 15407 2
#5: 15407 3
#6: 15403 1
或 dplyr
library(dplyr)
dat1 %>%
group_by(id) %>%
filter(any(tag != 1) & tag !=1 | all(tag==1) |is.na(tag))
基于第二个条件
dat1 %>%
group_by(id) %>%
filter(!(all(c(1,3) %in% tag) & tag ==1))
# A tibble: 6 x 2
# Groups: id [5]
# id tag
# <dbl> <dbl>
#1 15399 NA
#2 15404 NA
#3 15405 1
#4 15407 2
#5 15407 3
#6 15403 1
dat1[!duplicated(dat1$id,fromLast = TRUE)|duplicated(dat1$id)&dat1$tag!="1",]
您可以像这样简单地完成,但首先您需要按标签订购数据。这不是很漂亮的方法,但它应该有效。
> dat1[!duplicated(dat1$id,fromLast = TRUE)|duplicated(dat1$id)&dat1$tag!="1",]
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1
dat1 = data.frame(id=c(15399,15404,15405,15407,15407,15407,15403),
tag=c(NA,NA,1,1,2,3,1))#construct the data
dat1_tag3<-dat1[dat1$tag==3,]#keep the rows with tag equals to 3
dat1_tag3<-dat1_tag3[!is.na(dat1_tag3$id),]#remove NA's
dat2remove<-dat1[(dat1$id %in% unique(dat1_tag3$id) & dat1$tag==1),]#find rows that need to be excluded
all<-rbind(dat1,dat2remove)#rbinding the two datasets
all<-all[!(duplicated(all[c("id","tag")]) | duplicated(all[c("id","tag")], fromLast = TRUE)),]#removing duplicates (as pairs)
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1
我使用一个数据集,如果标签为 1 并且有一个标签为 3 的 ID 号,我想删除一行。编辑:标签值只能是:NA、1、2 或 3。 id 号是不同的,如果存在标签 1、标签 2 和标签 3,则只能找到三次。
> dat1 = data.frame(id=c(15399,15404,15405,15407,15407,15407,15403), tag=c(NA,NA,1,1,2,3,1))
> dat1
id tag
1 15399 NA
2 15404 NA
3 15405 1
4 15407 1
5 15407 2
6 15407 3
7 15403 1
我需要return这个:
> dat1
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1
有人可以帮助我吗?我只知道如何删除标签为 3:
的所有 ID> subset(dat1,!dat1$id %in% dat1$id[dat1$tag == 3])
id tag
1 15399 NA
2 15404 NA
3 15405 1
7 15403 1
我们可以用 data.table
library(data.table)
setDT(dat1)[, .SD[any(tag != 1) & tag !=1 | all(tag==1) |is.na(tag)] , by = id]
# id tag
#1: 15399 NA
#2: 15404 NA
#3: 15405 1
#4: 15407 2
#5: 15407 3
#6: 15403 1
如果条件是删除 'tag' 为 1 的行,其中对于特定 'id' 也有 'tag' 3,则
setDT(dat1)[, .SD[!(all(c(1,3) %in% tag) & tag == 1)] , id]
# id tag
#1: 15399 NA
#2: 15404 NA
#3: 15405 1
#4: 15407 2
#5: 15407 3
#6: 15403 1
或 dplyr
library(dplyr)
dat1 %>%
group_by(id) %>%
filter(any(tag != 1) & tag !=1 | all(tag==1) |is.na(tag))
基于第二个条件
dat1 %>%
group_by(id) %>%
filter(!(all(c(1,3) %in% tag) & tag ==1))
# A tibble: 6 x 2
# Groups: id [5]
# id tag
# <dbl> <dbl>
#1 15399 NA
#2 15404 NA
#3 15405 1
#4 15407 2
#5 15407 3
#6 15403 1
dat1[!duplicated(dat1$id,fromLast = TRUE)|duplicated(dat1$id)&dat1$tag!="1",]
您可以像这样简单地完成,但首先您需要按标签订购数据。这不是很漂亮的方法,但它应该有效。
> dat1[!duplicated(dat1$id,fromLast = TRUE)|duplicated(dat1$id)&dat1$tag!="1",]
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1
dat1 = data.frame(id=c(15399,15404,15405,15407,15407,15407,15403),
tag=c(NA,NA,1,1,2,3,1))#construct the data
dat1_tag3<-dat1[dat1$tag==3,]#keep the rows with tag equals to 3
dat1_tag3<-dat1_tag3[!is.na(dat1_tag3$id),]#remove NA's
dat2remove<-dat1[(dat1$id %in% unique(dat1_tag3$id) & dat1$tag==1),]#find rows that need to be excluded
all<-rbind(dat1,dat2remove)#rbinding the two datasets
all<-all[!(duplicated(all[c("id","tag")]) | duplicated(all[c("id","tag")], fromLast = TRUE)),]#removing duplicates (as pairs)
id tag
1 15399 NA
2 15404 NA
3 15405 1
5 15407 2
6 15407 3
7 15403 1