根据另一组列替换多列中的值

问题描述 投票:0回答:1

如果多个列中的值大于另一组列,我想删除它们。

适用于单列(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)))

但这不起作用

r compare na
1个回答
3
投票
  1. 我认为你的“完成”缺少
    check.1
    第1行大于其
    before.1
    值,那也应该是
    NA
    (?)
  2. na_if
    只会替换为相等的
    NA
    值,没有不平等测试,我们可以毫无困难地转向
    if_else
  3. 我们不能以这种方式引用
    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
一样。)

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.