删除包含特定字符串的群组。

4

我有一个关于删除包含某些字符串的组的问题,例如如果包含.。我希望在不破坏管道的情况下实现这一点。我的意思是不使用任何join函数。

示例数据:

vals <- c("good","bad",'ugly',"good","bad.","ugly")

    gr <- gl(2,3)

vals gr
1 good  1
2  bad  1
3 ugly  1
4 good  2
5 bad.  2
6 ugly  2

df <- data.frame(vals,gr)

我尝试了。
library(dplyr)
        df%>%
          filter(!grepl("\\.",vals))

这个功能只会删除满足条件的行,但我想要删除整个gr 2

 vals gr
1 good  1
2  bad  1
3 ugly  1
4 good  2
5 ugly  2

这个 df <- data.frame(vals,gr) 应该放在你展示的第一个数据框之前,否则就没有意义了(不是按时间顺序)。我建议进行编辑,但审核人员错误地认为它改变了你的帖子。 - Nakx
4个回答

8
也许像这样:

可能是这样的:

df %>% group_by(gr) %>% filter(all(!grepl("\\.",vals)))

1
@Tjebo filter 一次只能对一个分组进行操作,并强制要求该组中的所有 vals 不包含句号。 - joran
@joran 感谢您提供的优雅解决方案。顺便问一下,关于我的另一篇帖子,是否已经有解决方案了?我尝试了您的最后一条评论,但仍然没有成功。所有组号都是不同的。special-grouping-number-for-each-pairs - Alexander
@joran 我理解!grepl过滤器,但我不明白为什么'gr 2'被过滤掉。这是因为它将组1评估为TRUE,然后组2为FALSE吗? - tjebo
@Tjebo 不要忘记,它是在每个组中独立操作的。因此,当筛选器仅对每个组内的观察结果起作用时。 - joran
@joran 啊,铃声响了。抱歉,我花了一些时间才明白...哎呀...干杯!! - tjebo

2
另一个选择可能是使用%in%运算符。
df %>% 
 filter(!(gr %in% unique(ifelse(grepl("\\.",vals),gr,NA) )))

#  vals gr
#1 good  1
#2  bad  1
#3 ugly  1

据我所知,OP请求删除包含特定字符串的整个组。您的解决方案仅删除了特定行,而gr 2的其他成员未被删除。 - Uwe
@Uwe 感谢您指出这个问题。我已经纠正了我的错误。实际上,我正在使用 mutatemapply 来解决问题,类似于 df %>% mutate(InValidGroup = ifelse(mapply(grepl,“\\。” ,vals),gr,NA))%>% filter(!(gr%in%unique(InValidGroup)))%>% select(-InValidGroup),但在添加答案时搞砸了。您的答案也很好。 - MKR

2

当群组成员中的某个字符串包含特定字符串vals时,OP请求删除整个群组 - 破坏管道。

OP明确表示:我的意思是不使用任何join函数。

然而,我认为使用反向连接不会破坏管道:

library(dplyr)
data.frame(vals, gr) %>% 
  anti_join(., filter(., grepl("\\.",vals)), by = "gr")
  vals gr
1 good  1
2  bad  1
3 ugly  1

1

这里有一个使用 base R 中的 subsettable 的选项。

subset(df, gr %in% names(which(!table(gr, grepl("\\.", vals))[,2])))
#  vals gr
#1 good  1
#2  bad  1
#3 ugly  1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接