2015-07-11 55 views
4
df <- 
    data.frame(a=LETTERS[1:4], 
      b=rnorm(4) 
      ) 

vals <- c("B","D") 

我可以過濾/子集df與值val與:在R:子集或dplyr ::濾波器具有可變從矢量

dplyr::filter(df, a %in% vals) 
subset(df, a %in% vals) 

兩者給出:

a   b 
2 B 0.4481627 
4 D 0.2916513 

如果什麼我有一個向量中的變量名,例如:

> names(df)[1] 
[1] "a" 

然後它不工作 - 我猜是因爲它援引

dplyr::filter(df, names(df)[1] %in% vals) 
[1] a b 
<0 rows> (or 0-length row.names) 

你如何做到這一點?

UPDATE(如果dplyr :: tbl_df(DF)是什麼)

回答下面工作的優良data.frames,但不適用於dplyr :: tbl_df包裝的數據:

df<-dplyr::tbl_df(df) 
dplyr::filter(df, df[,names(df)[1]] %in% vals) 

不不行(我以爲tbl_df是在DF之上的簡單包裝?)

這不會再工作:

dplyr::filter(df, as.data.frame(df)[,names(df)[1]] %in% vals) 

最後更新:它使用lazyeval ::口譯

見AndreyAkinshin的下面的解決方案可與tbl_df()。

+0

@VeerendraGadekar:如下所述,我需要char向量中的變量名。 – user3375672

回答

6

您可以使用df[,"a"]df[,1]

df <- data.frame(a = LETTERS[1:4], b = rnorm(4)) 
vals <- c("B","D") 

dplyr::filter(df, df[,1] %in% vals) 
# a   b 
# 2 B 0.4481627 
# 4 D 0.2916513 

subset(df, df[,1] %in% vals) 
# a   b 
# 2 B 0.4481627 
# 4 D 0.2916513 

dplyr::filter(df, df[,"a"] %in% vals) 
# a   b 
# 2 B 0.4481627 
# 4 D 0.2916513 

subset(df, df[,"a"] %in% vals) 
# a   b 
# 2 B 0.4481627 
# 4 D 0.2916513 

與dplyr工作:: tbl_df(DF)

一些魔術lazyeval::interp幫助我們!

df <- dplyr::tbl_df(df) 
expr <- lazyeval::interp(quote(x %in% y), x = as.name(names(df)[1]), y = vals) 

df %>% filter_(expr) 
# Source: local data frame [2 x 2] 
# 
# a  b 
# 1 B 0.4481627 
# 2 D 0.2916513 
+0

是的原因 - 但如果我不知道變量的位置,只有變量名稱。我需要在一個向量中顯示var名稱。 – user3375672

+0

@ user3375672,已更新。 – AndreyAkinshin

+0

美麗。而已。簡單! – user3375672