我想根据特定条件在几列中过滤数据帧。
我使用下面的示例使我的陈述更加清楚。
我有一个数据框:
dat <- data.frame(A = c(122, 122, 122), B = c(0.1, 0.1, 0.1),
C = c(5, 5, 4), D = c(6, 7, 6))
我想选择同时包含C和D列最大值的行,我的R代码是:
select <- dat %>%
group_by(A, B) %>%
filter(C == max(C) , D == max(D))
我想要我想要的东西:
> select
# A tibble: 1 x 4
# Groups: A, B [1]
A B C D
<dbl> <dbl> <dbl> <dbl>
1 122 0.1 5 7
但是,我想使用filter_at()
函数
select <- dat %>%
group_by(A, B) %>%
filter_at(vars(C, D), all_vars(. max))
它没有用。非常感谢您的帮助。
答案 0 :(得分:2)
您可以这样做:
dat %>%
group_by(A, B) %>%
filter_at(vars(C, D), all_vars(. == max(.)))
以前的问题是all_vars()
,它的评估结果是合乎逻辑的。而且,如果没有相等运算符==
,>
,<
,就会向您抛出错误。
答案 1 :(得分:0)
从dplyr 1.0开始,有一种选择,过滤和变异的新方法。这可以通过across
函数和某些辅助动词来完成。对于这种特殊情况,也可以按以下步骤完成过滤:
dat %>%
group_by(A, B) %>%
filter(across(c(C, D), ~ . == max(.)))
# A tibble: 1 x 4
# Groups: A, B [1]
A B C D
<dbl> <dbl> <dbl> <dbl>
1 122 0.1 5 7