2017-05-24 74 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

我們在這裏利用第三種用法。