r - 将一列与多列进行比较并在 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)))
那 ???只是意味着我不知道该放什么。可能还有一种更简单的方法可以做到这一点,但我不是专家。在尝试大规模操作数据时,我往往会绊倒。
感谢所有的帮助!
解决方案
在这里,我们不需要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))
推荐阅读
- ruby-on-rails - Ruby On Rails - 重定向整个请求
- c++ - C++/地址空间:每个地址 2 字节?
- javascript - 嵌套的 javascript 调用
- java - azure API 应用程序每天第一次调用很慢
- javascript - node.js 和 gulp 中的 firebase 问题
- r - R dplyr - 循环数据帧列表 %>% 左连接 %>% 多个数据帧
- c# - 使用 dapper 从数据库返回一个 varchar
- java - 注销时删除所有 SharedPreferences
- python - Pandas 查询 group by /order by
- javascript - 具有可变内容的元素的动画高度