将一列与多列进行比较,并在r中使用dplyr覆盖值
r中的概念很容易理解,但语法却让我头疼不已。我有一列值要与其他列中的值进行比较,如果满足条件,我要覆盖要比较的列中的值。我必须对数百列和数千行执行此操作,但我无法获得正确的语法来对列的范围进行比较。以下是一个例子:将一列与多列进行比较,并在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
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))