R 使用mapply根据其他列中的值设置值

R 使用mapply根据其他列中的值设置值,r,mapply,R,Mapply,基于我的,我需要正确使用mapply函数的帮助 x <- data.frame(a = seq(1,3), b = seq(2,4), c = seq(3,5), d = seq(4,6), b2 = seq(5,7), c2 = seq(6,8), d2 = seq(7,9)) # a b c d b2 c2 d2 # 1 2 3 4 5 6 7 # 2 3 4 5 6 7 8 # 3 4 5 6 7 8 9 我的目标是查看b2到d2列,并根据它们的值分别更改b到d列中的

基于我的,我需要正确使用mapply函数的帮助

x <- data.frame(a = seq(1,3), b = seq(2,4), c = seq(3,5), d = seq(4,6), b2 = seq(5,7), c2 = seq(6,8), d2 = seq(7,9))

# a b c d b2 c2 d2
# 1 2 3 4 5  6  7
# 2 3 4 5 6  7  8
# 3 4 5 6 7  8  9
我的目标是查看b2到d2列,并根据它们的值分别更改b到d列中的值。我可以很容易地对单个列执行此操作:

x[which(x$b2 == 7),][b] <- NA_real_
我的问题是,我想在我所有的列上都应用这个公式,但我不知道如何将这个单列公式转换为适用于多个列。我试过:

onez <- c(2:4)
twoz <- c(5:7)
f <- function(df, ones, twos) {
  df[which(df[,twos] == 7),][ones] <- NA_real_
}

mapply(f, df = x, ones = onez, twos = twoz)

但我收到错误消息、尺寸不正确等,我发现我的函数很混乱,但我缺乏修复它的知识。

一种方法是告诉它:

获取包含第5、6、7:x[5:7]列的数据帧子集

从该子集中检查哪些值满足您的条件:x[5:7]==7


将这些值替换为NA:。。。x[5:7][x[5:7]==7]@Sotos-Hm,这确实有效,但我不知道为什么。你能解释一下步骤吗?你是说x[2:4][x[5:7]==7]@Humpelstielzchen,是的,我忘了我改正了。我加了一个答案。看一看,让我知道这是一个非常简单的答案,我只是没有意识到你可以用这种方式对多个列进行子集,并将子集用作另一个子集的索引。谢谢
x[5:7][x[5:7] == 7]  <- NA
x
#  a b c d b2 c2 d2
#1 1 2 3 4  5  6 NA
#2 2 3 4 5  6 NA  8
#3 3 4 5 6 NA  8  9
x[2:4][x[5:7] == 7] <- NA
x
#  a  b  c  d b2 c2 d2
#1 1  2  3 NA  5  6  7
#2 2  3 NA  5  6  7  8
#3 3 NA  5  6  7  8  9