我有一个数据框,其中一列包含数值向量。我想根据涉及该列的条件来过滤行。这是一个简化的示例。

df <- data.frame(id = LETTERS[1:3], name=c("Alice", "Bob", "Carol"))
mylist=list(c(1,2,3), c(4,5), c(1,3,4))
df$numvecs <- mylist
df
#   id  name   numvecs
# 1  A  Alice  1, 2, 3
# 2  B  Bob    4, 5
# 3  C  Carol  1, 3, 4


我可以使用像mapply这样的东西

mapply(function(x,y) x=="B" & 4 %in% y, df$id, df$numvecs)


正确地为第二行返回TRUE,并为行1和2返回FALSE。

但是,我有理由为什么要使用dplyr过滤器而不是mapply,但是我无法使dplyr过滤器在numvecs列上正确运行。而不是返回两行,下面的命令不返回任何行。

filter(df, 4 %in% numvecs)
# [1] id      numvecs
#    <0 rows> (or 0-length row.names)


我在这里想念什么?如何筛选涉及numvecs列的条件表达式?

理想情况下,我也想使用非标准评估filter_,因此我可以将过滤条件作为参数传递。任何帮助表示赞赏。谢谢。

最佳答案

我们仍然可以将mapplyfilter一起使用

filter(df, mapply(function(x,y) x == "B" & 4 %in% y, id, numvecs))
#  id name numvecs
#1  B  Bob    4, 5




或使用map中的purrr

library(purrr)
filter(df, unlist(map(numvecs, ~4 %in% .x)))
#  id  name numvecs
#1  B   Bob    4, 5
#2  C Carol 1, 3, 4


或者我们也可以连锁做

df %>%
    .$numvecs %>%
     map( ~ 4 %in% .x) %>%
     unlist %>%
     df[.,]
#  id  name numvecs
#2  B   Bob    4, 5
#3  C Carol 1, 3, 4

10-04 14:44