我想使用在变量中定义的字段过滤数据框,以选择也在变量中的值。说我有
df <- data.frame(V=c(6, 1, 5, 3, 2), Unhappy=c("N", "Y", "Y", "Y", "N"))
fld <- "Unhappy"
sval <- "Y"
我想要的值是
df[df$Unhappy == "Y", ]
.我已阅读
nse
小插图尝试使用 filter_
但不能完全理解。我试过df %>% filter_(.dots = ~ fld == sval)
什么都没有返回。我得到了我想要的
df %>% filter_(.dots = ~ Unhappy == sval)
但显然这违背了使用变量来存储字段名称的目的。请问有什么线索吗?最终我想用这个 where
fld
是字段名称和 sval
的向量是 fld
中每个字段的过滤器值向量.
最佳答案
你可以试试 interp
来自 lazyeval
library(lazyeval)
library(dplyr)
df %>%
filter_(interp(~v==sval, v=as.name(fld)))
# V Unhappy
#1 1 Y
#2 5 Y
#3 3 Y
对于多个键/值对,我发现这是可行的,但我认为应该有更好的方法。
df1 %>%
filter_(interp(~v==sval1[1] & y ==sval1[2],
.values=list(v=as.name(fld1[1]), y= as.name(fld1[2]))))
# V Unhappy Col2
#1 1 Y B
#2 5 Y B
对于这些情况,我找到了
base R
选择更容易。例如,如果我们尝试 filter
基于'fld1'中'key'变量和'sval1'中对应值的行,一种选择是使用Map
.我们对数据集 ( df1[fld1]
) 进行子集化并将 FUN ( ==
) 应用于 df1[f1d1]
的每一列在 'sval1' 中使用相应的值并使用 &
与 Reduce
获得可用于 filter
的逻辑向量'df1' 的行。 df1[Reduce(`&`, Map(`==`, df1[fld1],sval1)),]
# V Unhappy Col2
# 2 1 Y B
#3 5 Y B
数据
df1 <- cbind(df, Col2= c("A", "B", "B", "C", "A"))
fld1 <- c(fld, 'Col2')
sval1 <- c(sval, 'B')
关于r - 在 dplyr 中使用 filter_ ,其中字段和值都在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760134/