【问题标题】:How to filter rows only if a string matches for multiple columns仅当字符串与多列匹配时如何过滤行
【发布时间】:2020-08-10 20:08:18
【问题描述】:

我只想在字符串匹配多列时过滤行。我寻找答案,但没有找到。我想我不知道要寻找什么。

所以,假设我有一个这样的 tibble。

library(tibble)
tib1 <- tibble(ID = 1:3, Col.1 = c("Hi", "Hello", "ND"), Col.2 = c("Bye", "ND", "ND"))
tib1


# A tibble: 3 x 3
     ID Col.1 Col.2
  <int> <chr> <chr>
1     1 Hi    Bye  
2     2 Hello ND   
3     3 ND    ND 

我想知道如何获得这个回报。

# A tibble: 1 x 3
     ID Col.1 Col.2
  <dbl> <chr> <chr>
1     3 ND    ND 

我尝试了如下的一些代码行,但它总是返回与字符串匹配的所有行。

tib1 %>% filter_at(vars(Col.1, Col.2), any_vars(str_detect(., "ND")))

# A tibble: 2 x 3
     ID Col.1 Col.2
  <int> <chr> <chr>
1     2 Hello ND   
2     3 ND    ND 

我该怎么做?我想用 tidyverse 包来做。

谢谢你,祝你有美好的一天。

【问题讨论】:

    标签: r dplyr stringr


    【解决方案1】:

    这应该会提供您想要的输出 - 将 any_vars 更改为 all_vars 将谓词从 | 更改为 &amp;

    tib1 %>% 
      filter_at(vars(Col.1, Col.2), all_vars(str_detect(., "ND")))
    

    【讨论】:

      【解决方案2】:
      has_multiple <- function(s, v) {
        
        occurrences <- v == s
        sum(occurrences) > 1
          
      }
      
      tib1 %>% 
        rowwise() %>% 
        filter(has_multiple('ND', c_across(Col.1:Col.2)))
      

      @EJJ 的答案将返回 所有 变量为“ND”的行。

      我的代码返回两个或多个(但不一定是所有)变量为“ND”的行。

      当然,在这个例子中,只有两个变量,结果是一样的。

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多