2017-05-24 72 views
0

这似乎是一个简单的问题,但我还没有遇到一个干净的解决方案。我在R中有一个向量,我想从向量中移除某些元素,但是我想避免vector [vector!=“thiselement”]符号,原因有很多。特别是,这是我想要做的:dplyr过滤器,而不是R中的数据帧

# 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

我只是想变得更舒适,使用dplyr编写更干净的代码。我可以在技术上做到这一点,但它必须是: all_states = gsub(“”,“ - ”,tolower(state.name))[gsub(“”,“ - ”,tolower(state 。名称)) !=“alaska”] – Canovice

+0

该列表将被扩展为包含其他状态,并且您的解决方案不会将格式设置为我正在执行的州名称 – Canovice

+4

'dplyr'中的'd'用于数据。 frame'。 “使用dplyr编写更干净的代码”应该意味着使用“dplyr”来创建它(数据框),而不是在不适当的时候使用它(不是数据框)。 – Gregor

回答

1

很确定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 
+0

明白了。是的,也许我会让自己的生活比需要的更难。好的,谢谢 – Canovice

+1

是的,它有一个很好的工具来使用。在我看来,dplyr最终看起来比基本的R代码更干净。不幸的是,它总是与媒介混杂在一起。 –

2

你可能想尝试magrittr::extract。例如

> library(magrittr) 

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

更多extract样功能负载magrittr包和类型?alises

1

对不起,发布一个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

我们在这里利用第三种用法。