dplyr/tidy基于子字符串过滤向量的方法?

dplyr/tidy基于子字符串过滤向量的方法?,r,dplyr,R,Dplyr,我们可以看到一些很好的例子;对于向量,是否有一种整洁的方法可以做到这一点?(即没有或类似) 例子 我尝试了在data.frame上工作的方法 # Leave only words that don't begin with 'cat' vec <- c("cat", "catamaran", "dog", "mouse", "catacombs") vec %>% filter(s

我们可以看到一些很好的例子;对于向量,是否有一种整洁的方法可以做到这一点?(即没有或类似)

例子 我尝试了在data.frame上工作的方法

# Leave only words that don't begin with 'cat'

vec <- c("cat", "catamaran", "dog", "mouse", "catacombs")

vec %>% filter(substr(1, 3) != "cat") # %>% ... etc
注 我们可以使用类似于
vec%>%{.[!grepl(“cat”,)]}
,或者更准确地说是
vec%>%{.[substr(,1,3)!=“cat”]}
,但我会尝试找到

  • 对初学者更友好,具有更多口头描述功能(例如,一个完全的新手可能会猜到“过滤器”的作用,但可能不会猜到“grepl”)
  • 语法不那么挑剔(尽可能少的
    {
    }
  • 更优雅的管道(例如
    vec%%>%过滤器(…)%%>%下一步操作
  • 包含尽可能少的重复,注意
    grepl
    方法使用原始向量(由
    表示)两次(而理想情况下仅使用一次)

  • 我认为
    tidyverse
    更适合于数据帧/列表,而不是向量。如果要执行多个操作,则需要管道,但在这里,您可以使用单个函数(
    grep
    )获得预期结果,而无需任何管道

    grep('^cat', vec, value = TRUE, invert = TRUE)
    #[1] "dog"   "mouse"
    

    或者将向量转换为数据帧,然后使用

    library(dplyr)
    library(tibble)
    
    vec %>% enframe() %>% filter(!startsWith(value, 'cat'))
    


    如果您不介意使用不同的软件包,可以使用
    stringi
    软件包中的
    stri\u detect\u fixed
    功能

    install.packages('stringi')
    library(stringi)
    
    vec <- c("cat", "catamaran", "dog", "mouse", "catacombs")
    vec[stri_detect_fixed(vec, 'cat')]
    

    然后,您应该能够将其传输到您想要的任何命令。

    使用
    tidyverse
    ,我们可以将其转换为
    tibble
    ,在
    过滤器中使用
    stru-detect
    拉取

    library(dplyr)
    library(stringr)
    tibble(vec) %>%
          filter(!str_detect(vec, "^cat")) %>%
          pull(vec)
    #[1] "dog"   "mouse"
    

    或使用
    magrittr

    vec %>%
         str_detect("^cat") %>%
         `!` %>%
         magrittr::extract(vec, .)
    #[1] "dog"   "mouse"
    

    使用
    purrr
    处理向量

    library(purrr)
    library(stringr)
    
    vec <- c("cat", "catamaran", "dog", "mouse", "catacombs")
    vec %>% discard(.p=str_detect, pattern = "^cat")
    
    库(purrr)
    图书馆(stringr)
    向量%discard(.p=str_detect,pattern=“^cat”)
    
    library(dplyr)
    library(stringr)
    tibble(vec) %>%
          filter(!str_detect(vec, "^cat")) %>%
          pull(vec)
    #[1] "dog"   "mouse"
    
    vec %>%
         str_detect("^cat") %>%
         `!` %>%
         magrittr::extract(vec, .)
    #[1] "dog"   "mouse"
    
    library(purrr)
    library(stringr)
    
    vec <- c("cat", "catamaran", "dog", "mouse", "catacombs")
    vec %>% discard(.p=str_detect, pattern = "^cat")