假设我们有这样的 Dataframe :
> data <- data.frame('a' = c('a', 'b', 'c'),
'b' = c('d', 'e', 'f'),
'c' = c('g', 'h', 'i'),
'd' = c('j', 'k', 'l'))
如果我想根据列a进行筛选以获得一些值,我可以这样做:
> library(dplyr)
> data %>% filter(a == "b")
a b c d
1 b e h k
如果我想根据列a和列b进行筛选以获得一些值,我可以这样做:
> library(dplyr)
> data %>% filter(a == "c" & b == "f")
a b c d
1 c f i l
如果我有一个任意长度的列的列表呢?有没有办法做这样的事情?
> data %>% filter(c(a,b) == c("c","f"))
因此,我可以将列名的任意列表以及所需值的列表传递给filter函数。
4条答案
按热度按时间xxhby3vn1#
基本R答案:
这也适用于
filter
:并翻译成
tidyverse
函数:5w9g7ksd2#
您可以使用
data.frame
来跟踪条件,并使用join语法代替filter():ewm0tg9j3#
也许这对你的情况来说有点过头了,但我还是自由地允许多个值进行筛选。
现在,手动完成时
filter
条件如下所示。答案-
要以自动化的方式将条件保存在列表中,请使用自定义函数
filter_data
并将其与imap
一起使用。xmakbtuz4#
我喜欢
inner_join
解决方案,这是我通常在可能的情况下使用的解决方案。但是,在比较比较比较复杂的情况下,这种方法不起作用,在这种情况下,可以使用expression splicing将筛选表达式的列表传递给
filter
。为此,首先必须通过将列名和值插入到比较表达式中来创建表达式列表:
然后你可以在
filter
中使用这个表达式列表: