如果多个列中的值大于另一组列,我想删除它们。
适用于单列(check.1)的类似方法是
filter(if_any(before.1:before.3,~ check.1 < .x))
。这会过滤 check.1 小于之前任何列的行。
但是,我也有列 check.2、check.3 等,并且只想在所有检查列都大于之前的任何列时删除该行(之后我可以很容易地做到这一点)。
我的主要目标是,如果任何检查列值大于每行中任何之前的列值,则将其替换为 NA。非常乐意澄清,因为这是一个有点奇怪的问题
开始:
之前.1 | 之前.2 | 之前.3 | 检查.1 | 检查2 | 检查.3 |
---|---|---|---|---|---|
34 | 23 | 33 | 35 | 14 | 46 |
56 | 24 | 24 | 45 | 63 | 14 |
完成:
之前.1 | 之前.2 | 之前.3 | 检查.1 | 检查2 | 检查.3 |
---|---|---|---|---|---|
34 | 23 | 33 | 不适用 | 14 | 不适用 |
56 | 24 | 24 | 45 | 不适用 | 14 |
我觉得可能是这样的:
mutate(across(check.1:check.3,~na_if(.x >before.1:before.3)))
但这不起作用
check.1
第1行大于其before.1
值,那也应该是NA
(?)na_if
只会替换为相等的NA
值,没有不平等测试,我们可以毫无困难地转向if_else
。before.1:before.3
,我们可以使用cur_column()
来获取当前列(例如,"check.1"
),将“检查”更改为“之前”,然后使用cur_data()[[..]]
拉动该列。 mutate(bef,
across(
check.1:check.3,
~ if_else(.x > cur_data()[[sub("check", "before", cur_column())]], NA, .x)
)
)
# before.1 before.2 before.3 check.1 check.2 check.3
# 1 34 23 33 NA 14 NA
# 2 56 24 24 45 NA 14
(有点让你想要一个
across2(..)
功能,就像 purrr::
有 map2
和 reduce2
一样。)