首页 > 解决方案 > 将一列与多列进行比较并在 r 中用 dplyr 覆盖值

问题描述

r 中的概念很容易理解,但语法一直让我很头疼。我有一列值要与一系列其他列中的值进行比较,如果满足条件,我想覆盖要比较的列中的值。我必须对数百列和数千行执行此操作,并且我无法正确使用语法来与列范围进行比较。这是一个例子:

base    a_01    a_02    a_03    a_04    ...     a_n
0.4        1       0       0       1              1
0.3        1       1       0       1              1
0.4        0       0       0       1              0
0.35       0       1       0       1              1
0.4        1       1       1       1              1
0.4        0       0       0       0              1
0.4        1       1       1       1              1
0.2        1       1       1       1              1
0.32.      0       0       1       1              0
0.4        1       1       1       1              1

期望的输出:

base    a_01    a_02    a_03    a_04    ...  a_n
0.4        1       0       0       1          1
0.3        0       0       0       0          0
0.4        0       0       0       1          0
0.35       0       0       0       0          0
0.4        1       1       1       1          1
0.4        0       0       0       0          1
0.4        1       1       1       1          1
0.2        0       0       0       0          0
0.32       0       0       0       0          0
0.4        1       1       1       1          1

因此,在上面的示例中,base 是我与每个 a_ 列进行比较的列。如果 base >=.4 且 a_* 为 1,则 a_* 保持为 1,否则为 0。我试图让它使用:

df <- df %>% mutate(across(contains("a_"), ifelse( ??? && base >= .4)))

那 ???只是意味着我不知道该放什么。可能还有一种更简单的方法可以做到这一点,但我不是专家。在尝试大规模操作数据时,我往往会绊倒。

感谢所有的帮助!

标签: rdplyr

解决方案


在这里,我们不需要ifelse, 创建一个带有比较运算符的逻辑向量,然后用+or将其强制为二进制as.integer。lambda 函数符号是~.代表列值

library(dplyr)
df %>%
      mutate(across(contains("a_"), ~  +( .  == 1 & base >= .4)))

-输出

#     base a_01 a_02 a_03 a_04 a_n
#1    0.4    1    0    0    1   1
#2    0.3    0    0    0    0   0
#3    0.4    0    0    0    1   0
#4   0.35    0    0    0    0   0
#5    0.4    1    1    1    1   1
#6    0.4    0    0    0    0   1
#7    0.4    1    1    1    1   1
#8    0.2    0    0    0    0   0
#9  0.32.    0    0    0    0   0
#10   0.4    1    1    1    1   1

数据

df <- structure(list(base = c("0.4", "0.3", "0.4", "0.35", "0.4", "0.4", 
"0.4", "0.2", "0.32.", "0.4"), a_01 = c(1L, 1L, 0L, 0L, 1L, 0L, 
1L, 1L, 0L, 1L), a_02 = c(0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 
1L), a_03 = c(0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 1L), a_04 = c(1L, 
1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L), a_n = c(1L, 1L, 0L, 1L, 
1L, 1L, 1L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA, 
-10L))

推荐阅读