我的数据和包使用:
library(dplyr)
data <- data.frame(id = c(1:3, rep(4, 3), 5:6),
id1 = c(7:9, 1:3, 10:11),
value = 1:8 * 10,
value1 = 1:8 * 20,
chkvar = c(rep(TRUE, 3), rep(FALSE, 3), rep(TRUE, 2)))
如果chkvar==False,我想用对应的值替换id1和value1中的值,其中id1在id中.我可以通过两个步骤实现这一点:
data %>%
mutate(value1 = ifelse(chkvar == FALSE,
value1[match(id1, id)],
value1),
id1 = ifelse(chkvar == FALSE,
id1[match(id1, id)],
id1))
id id1 value value1 chkvar
1 1 7 10 20 TRUE
2 2 8 20 40 TRUE
3 3 9 30 60 TRUE
4 4 7 40 20 FALSE
5 4 8 50 40 FALSE
6 4 9 60 60 FALSE
7 5 10 70 140 TRUE
8 6 11 80 160 TRUE
但是我的整个数据集有更多的列要替换,因此需要一个需要更少代码的解决方案.我试着改编了this answer:
data %>%
mutate_at(.vars = vars(value1, id1),
.funs = list(~ifelse(!chkvar, value1[match(id1, id)], .)))
但是,如果!chkvar为真,我不知道如何声明多个列.对我来说,我似乎是一项简单的任务,但也许用ifelse()
美元是不可能的?我找到的其他答案涉及使用coalesce()
,但我没有遗漏值,或者我不知道如何修改代码.我找到的case_when()
个解决方案也需要为每一列单独声明.