df <-
data.frame(a=LETTERS[1:4],
b=rnorm(4)
)
vals <- c("B","D")
我可以过滤/子集df
值在val
with:
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)
你怎么做到这一点 ?
更新(如果是 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::interp 与 tbl_df() 一起使用
请参阅下面 AndreyAkinshin 的解决方案。