【问题标题】:Select all elements of a vector except one in dplyr pipeline选择一个向量的所有元素,除了 dplyr 管道中的一个
【发布时间】:2016-11-04 19:59:07
【问题描述】:

我想选择字符向量的所有元素,除了与特定字符匹配的元素。
我可以使用 %in% 轻松完成此操作,但我不知道如何在 dplyr 管道中执行此操作。

示例:
我想要什么

names<-c("a","b","c","d","e")
names[!names %in% "c"]
 [1] "a" "b" "d" "e"

我想要它:

names<-c("a","b","c","d","e")
names %>% ...something...

【问题讨论】:

    标签: r vector dplyr


    【解决方案1】:

    如果没有重复,我们可以使用setdiff

    library(magrittr)
    names %>% 
         setdiff(., "c")
    #[1] "a" "b" "d" "e"
    

    或者使用 magrittr 操作对向量进行子集化。

    names %>%
       `%in%`("c") %>% 
       `!` %>%
        extract(names, .)
    #[1] "a" "b" "d" "e"
    

    【讨论】:

    • 如果向量中有任何重复,这将与预期结果不同
    • @docendodiscimus names1 &lt;- c(names, "c"); identical(names1 %&gt;% setdiff(., "c"), names1[!names1 %in% "c"]) #[1] TRUE
    • 试试这个:names1 &lt;- c(names, "a"); identical(names1 %&gt;% setdiff(., "c"), names1[!names1 %in% "c"]) #[1] FALSE
    • 第一个解决方案对我有用,因为我的字符向量中没有任何重复项。是的,我不想在链外这样做。谢谢!
    • 可能的。我个人强烈建议打破任何链条。我认为这与管道的意图完全相反(使代码更具可读性)
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2017-11-20
    相关资源
    最近更新 更多