首页 > 解决方案 > 在 R/dplyr 中使用变量名过滤函数

问题描述

我想从我的数据集中过滤特定行,并且我想定义过滤器函数之前的哪一行,但是每当我这样做时,我都会得到 0 个观察值。

我想这样做(这不起作用,因为我得到 0 个观察结果):

name <- "my_dna_42_x"
gene <- "my_gene_12213"
df2 <- df1 %>% group_by(DNA, ID) %>% filter(any(DNA == name && ID == gene)) 

但这确实有效(但我不希望这样做,因为我希望能够在运行之前定义名称和基因(并稍后将其变为函数)):

df2 <- df1 %>% group_by(DNA, ID) %>% filter(any(DNA == "my_dna_42_x" && ID == "my_gene_12213")) 

那么如何让过滤器函数在更早定义名称时接受名称或 ID?

(我也尝试过parse_expr(paste(name)),但效果不佳,我将名称定义为符号,然后像这样name <- sym("my_dna_42_x"):)

已解决:名称已经是列名

带有示例数据的问题:

set.seed(42) 
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
my_type <- "type 1"
filtered_dat <- dat %>% group_by(id, type) %>% filter(type == "my_type")

我在定义 my_type (最后两行)并再次调用它时遇到问题。

标签: rdplyr

解决方案


这可能是一个骗局(我在评论中提供的链接),但对于您的情况:

name <- "my_dna_42_x"
gene <- "my_gene_12213"
df2 <- df1 %>%
  group_by(DNA, ID) %>%
  filter(any(DNA == name & ID == gene))
###                      ^--- single '&'

查看两者之间的区别

c(TRUE, TRUE) && c(TRUE, FALSE)
# [1] TRUE
c(TRUE, TRUE) & c(TRUE, FALSE)
# [1]  TRUE FALSE

推荐阅读