dplyr过滤矢量而不是R中的数据帧

时间:2017-05-24 21:59:10

标签: r dplyr

这似乎是一个简单的问题,但我还没有找到一个干净的解决方案。我在R中有一个向量,我想从向量中删除某些元素,但是我想要出于各种原因避免使用向量[vector!=" thiselement"]表示法。特别是,这是我想要做的:

# this doesnt work
all_states = gsub(" ", "-", tolower(state.name)) %>% filter("alaska")

# this doesnt work either
all_states = gsub(" ", "-", tolower(state.name)) %>% filter(!= "alaska")

# this does work but i want to avoid this approach to filtering
all_states = gsub(" ", "-", tolower(state.name))
all_states = all_states[all_states != "alaska"]

这可以通过简单的方式完成吗?在此先感谢您的帮助!

编辑 - 我之所以挣扎,是因为我只是在网上找到有关根据数据框列进行过滤的事情,例如:

my_df %>% filter(col != "alaska")

但我在这里使用的是矢量而不是数据帧

3 个答案:

答案 0 :(得分:5)

很抱歉发布了一份为期5个月的问题,以便存档更简单的解决方案。

dplyr可以通过以下方式过滤字符向量:

> c("A", "B", "C", "D") %>% .[matches("[^AB]", vars=.)]
[1] "C" "D"
> c("A", "B", "C", "D") %>% .[.!="A"]
[1] "B" "C" "D"

第一种方法允许您使用正则表达式进行过滤,第二种方法使用较少的单词。它的工作原理是因为包dplyr导入包magrittr,尽管它会掩盖其extract之类的功能,但不会屏蔽占位符.

可以在forward-pipe operator %>%的帮助下找到占位符.的详细信息,此占位符主要有三种用法:

  
      
  • 将点用于次要目的
  •   
  • 使用带%>%
  • 的lambda表达式   
  • 使用点占位符作为lhs
  •   

我们正在利用其第三种用途。

答案 1 :(得分:3)

非常确定dplyr只对data.frames有效。这是一个两行示例,将向量强制转换为data.frame并返回。

myDf = data.frame(states = gsub(" ", "-", tolower(state.name))) %>% filter(states != "alaska")
all_states = myDf$states

或一个粗糙的衬垫:

all_states = (data.frame(states = gsub(" ", "-", tolower(state.name))) %>% filter(states != "alaska"))$states

答案 2 :(得分:3)

您可以尝试magrittr::extract。 e.g。

> library(magrittr)

> c("A", "B", "C", "D") %>% extract(.!="A")
[1] "B" "C" "D"

对于更多extract - 类似的函数,请加载magrittr包并输入?alises