【问题标题】:Remove groups that contain certain strings删除包含特定字符串的组
【发布时间】:2018-02-21 21:59:45
【问题描述】:

我有一个关于删除其行中包含某些字符串的组的问题,例如,如果包含.。我想在不破坏管道的情况下实现这一目标。我的意思是不使用任何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 &lt;- data.frame(vals,gr)应该在你显示的第一个数据帧输出的上方,否则没有意义(不是按时间顺序)。我建议进行此修改,但审稿人错误地认为它改变了您帖子的任何内容。

标签: r dplyr


【解决方案1】:

可能是这样的:

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

【讨论】:

  • @Tjebo filter 一次只在一个组上运行,它强制要求组内的所有vals 不包含句点。
  • @joran 感谢 joran 提供优雅的解决方案。顺便说一句,关于我的另一篇文章有​​什么解决方案吗?我尝试了您的最后一条评论,但仍然没有运气。所有组号都不同。 special-grouping-number-for-each-pairs
  • @joran 我了解 !grepl 过滤器,但我不明白为什么 'gr 2' 会被过滤掉。这是因为它评估第 1 组为 TRUE,然后第 2 组为 FALSE??
  • @Tjebo 不,记住它是在每个组上单独运行的。因此,当过滤器作用于每个组内的观察时。
  • @joran 啊,铃响了。抱歉,这需要一段时间才能进入我的脑海......哎呀......干杯!!
【解决方案2】:

当组成员之一在vals 中包含某个字符串时,OP 已请求删除整个组 - 不会破坏管道。

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

但是,我相信使用 anti-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

【讨论】:

    【解决方案3】:

    另一个选项可能是使用%in% 运算符。

    df %>% 
     filter(!(gr %in% unique(ifelse(grepl("\\.",vals),gr,NA) )))
    
    #  vals gr
    #1 good  1
    #2  bad  1
    #3 ugly  1
    

    【讨论】:

    • IIUC,OP 已请求删除出现特定字符串的整个组。您的解决方案只删除了特定行,gr2 的其他成员尚未删除。
    • @Uwe 感谢指出。我已经纠正了我的错误。实际上,我正在使用mutatemapply 类似df %&gt;% mutate(InValidGroup = ifelse(mapply(grepl, "\\.",vals),gr,NA) ) %&gt;% filter(!(gr %in% unique(InValidGroup))) %&gt;% select(-InValidGroup) 来解决解决方案,并在添加答案时搞砸了。你的 ans 看起来也不错。
    【解决方案4】:

    这是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
    

    【讨论】:

      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 2012-03-21
      • 2012-07-02
      • 1970-01-01
      • 2020-02-04
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多