3 回答

TA貢獻1872條經驗 獲得超4個贊
對于dplyr版本[0.3-0.7)(?-2017年6月)
(有關最新dplyr版本,請參閱此問題的其他答案)
從使用非標準評估(NSE,請參見發布和小插圖)的dplyr 0.3每個dplyr功能開始, 標準評估(SE)雙胞胎以下劃線結尾。這些可用于傳遞變量。因為會的。使用您可能會將邏輯條件作為字符串傳遞。filterfilter_filter_
filter_(df, "color=='blue'")
# color value
# 1 blue 1
# 2 blue 3
# 3 blue 4
用邏輯條件構造字符串當然很簡單
l <- paste(var, "==", "'blue'")
filter_(df, l)

TA貢獻1936條經驗 獲得超7個贊
在較新的版本中,我們可以使用我們可以創建帶引號的變量,然后取消引號(UQ或!!)以進行評估
var <- quo(color)
filter(df, UQ(var) == "blue")
# color value
#1 blue 1
#2 blue 3
#3 blue 4
由于運算符的優先級,我們可能需要()環繞!!
filter(df, (!!var) == "blue")
# color value
#1 blue 1
#2 blue 3
#3 blue 4
對于新版本,||優先級更高,因此
filter(df, !! var == "blue")
應該工作(如@Moody_Mudskipper評論)
較舊的選項
我們還可以使用:
filter(df, get(var, envir=as.environment(df))=="blue")
#color value
#1 blue 1
#2 blue 3
#3 blue 4
編輯:重新排列解決方案的順序

TA貢獻1830條經驗 獲得超3個贊
從dplyr 0.7開始,某些情況再次發生了變化。
library(dplyr)
df <- data.frame(
color = c("blue", "black", "blue", "blue", "black"),
value = 1:5)
filter(df, color == "blue")
# it was already possible to use a variable for the value
val <- 'blue'
filter(df, color == val)
# As of dplyr 0.7, new functions were introduced to simplify the situation
col_name <- quo(color) # captures the current environment
df %>% filter((!!col_name) == val)
# Remember to use enquo within a function
filter_col <- function(df, col_name, val){
col_name <- enquo(col_name) # captures the environment in which the function was called
df %>% filter((!!col_name) == val)
}
filter_col(df, color, 'blue')
dplyr編程插圖中介紹了更多一般情況。
- 3 回答
- 0 關注
- 538 瀏覽
添加回答
舉報