将一列与多列进行比较,并在r中使用dplyr覆盖值

将一列与多列进行比较,并在r中使用dplyr覆盖值,r,dplyr,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

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_uu列进行比较的列。如果基数>=0.4且a_*为1,则a_*保持为1,否则变为0。我试着让它工作:

df <- df %>% mutate(across(contains("a_"), ifelse( ??? && base >= .4)))
df%突变(跨越(包含(“a”),如果其他(?&&base>=.4)))
那个???就是说我不知道该放什么。也许还有更简单的方法,但我不是专家。当我试图大量操纵数据时,我往往会绊倒


谢谢你的帮助

这里,我们不需要一个
ifelse
,用比较运算符创建一个逻辑向量,然后用
+
作为.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
数据
dfA基本R选项

df[-1] <- with(df,(base >= 0.4)*df[-1])
数据

> dput(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))

出于某种原因,这是行不通的。当我将其应用于原始数据集时,所有值都设置为0。我发布的示例与真实数据集之间的唯一区别(除了要大得多之外)是,它还有其他列,如时间戳和其他未包含在Cross(contains())调用中的内容。这似乎不应该影响任何事情?可能会。运算符是否包括其他列?另外,是否有一个好的页面来解释r中的~?当我处理原始文件时,我似乎找不到任何更新。我去删除了其他每一个专栏,所以唯一的基础和a_'s就在那里。唯一的区别是base是最后一列,而不是第一列。运行代码后仍然得到相同的结果。我尝试的另一件事是“变异(跨越(包含(“a”),~+(a_1==1&base>=.4)),只需使用一个列来检查哪里可能出了问题。还有那一列。啊啊啊,没关系。这个解决方案非常有效。我有一个小小的语法错误,把一切都搞砸了。干杯请参阅下面我对dplyr解决方案的评论。我也试过这个。我得到了以下错误'error in Ops.POSIXt(左,右):'*'没有为“POSIXt”对象定义',我认为这与我在其他评论中提到的其他列有关。我需要以某种方式排除其他列,但我不确定如何做到这一点,请参阅dplyr解决方案中的其他注释。我剥离了文件中所有其他列,并尝试了这个解决方案。结果没有改变。不知道为什么会这样。
> df
   base a_01 a_02 a_03 a_04 a_n
1  0.40    1    0    0    1   1
2  0.30    0    0    0    0   0
3  0.40    0    0    0    1   0
4  0.35    0    0    0    0   0
5  0.40    1    1    1    1   1
6  0.40    0    0    0    0   1
7  0.40    1    1    1    1   1
8  0.20    0    0    0    0   0
9  0.32    0    0    0    0   0
10 0.40    1    1    1    1   1
> dput(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))