r - 在 dplyr 中使用 filter_ ,其中字段和值都在变量中

标签 r dplyr

我想使用在变量中定义的字段过滤数据框,以选择也在变量中的值。说我有

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/

相关文章:

r - R中合并多行

r - 使用 group_split,将单个值添加到列表中的每个项目以循环和累加

R - testthat 使用测试目录外的数据文件

r - drop_na( ) 不能作用于 POSIX-lt 对象

r - 传递标签以选择和返回服务器功能的值

r - 如何在 dplyr::across() 中使用 n() 按组计算行数?

r - 使用逻辑从现有多列数据帧生成新的多列数据帧

R Shiny 的绘图颜色有条件地基于单独数据框上的值

r - 使用 r 中的 mutate 在特定位置添加一列

r - 如何将列值的下半部分移动到新创建的列中?