这似乎是一个简单的问题,但我还没有找到一个干净的解决方案。我在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")
但我在这里使用的是矢量而不是数据帧
答案 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
。