R替换多个数据帧的多列中的值

R替换多个数据帧的多列中的值,r,if-statement,for-loop,replace,R,If Statement,For Loop,Replace,我已经花了一整天的时间试图弄明白这一点,但我对循环的理解并不是最好的。 我基本上有3个数据帧。它们包含多个列。我想一次检查每个数据帧。如果列中的一个值是-9999(NA),我想用其他数据帧中的值替换它(如果第二个数据帧中的相同值也是-9999,则应该取第三个数据帧中的值) 我用if else算出了。我就是不能让它进入一个for循环。所以我必须手工输入每一列,这需要很多时间,因为我有很多列都有奇怪的名字。下面是我的例子,以简单的形式。也许有人能帮我。非常感谢,苏西 par1 <- c(1,2

我已经花了一整天的时间试图弄明白这一点,但我对循环的理解并不是最好的。 我基本上有3个数据帧。它们包含多个列。我想一次检查每个数据帧。如果列中的一个值是-9999(NA),我想用其他数据帧中的值替换它(如果第二个数据帧中的相同值也是-9999,则应该取第三个数据帧中的值)

我用if else算出了。我就是不能让它进入一个for循环。所以我必须手工输入每一列,这需要很多时间,因为我有很多列都有奇怪的名字。下面是我的例子,以简单的形式。也许有人能帮我。非常感谢,苏西

par1 <- c(1,2,3,4)
par2 <- c(1,2,3,0)
par3 <- c(1,0,3,8)
par4 <- c(1,0,3,9)

r <- data.frame(par1, par2, par3, par4)
d <- data.frame(par1, par2, par3, par4)
b <- data.frame(par1, par2, par3, par4)

r$par1[4] <- -9999

gap_filling <- function(x,y,z){
  ifelse (x == -9999, 
          ifelse(y==-9999, z, y),
          x)
} ## this is the function I wrote to shorten it a little bit

r$par1 <- gap_filling(r$par1, d$par1, b$par1)
r$par2 <- gap_filling(r$par2, d$par2, b$par2)
r$par3 <- gap_filling(r$par3, d$par3, b$par3)
r$par4 <-gap_filling(r$par4, d$par4, b$par4)

### this is just the replacing for the first data frame. I need to do the same with the other two too
par1(编辑版,感谢Jake Burkead的评论)

您真正想要的是逻辑索引的功能

例如:

r[r==-9999] <- d[r==-9999]
r[r==-9999] <- b[r==-9999]
# # Alternate writing, if you have 'NA' instead of -9999
# # r[is.na(r)] <- matrix.d[is.na(r)]
# # r[is.na(r)] <- matrix.b[is.na(r)]

r[r==-9999]您可以在命名的
列表中组织
r
b
d
,并按照@Jealie和@JakeBurkhead的建议进行:

l <- list(r=r, d=d, b=b) 
invisible(lapply(1:length(l), function(i) { 
  for (x in setdiff(1:length(l), i))      
       l[[i]] [ l[[i]] == -9999] <<- l[[x]] [ l[[i]] == -9999]
}))
invisible(list2env(l, envir=.GlobalEnv)) # overwrite existing r, d, b  

l您可以这样做
data.frames
以及类似于
ifelse(r==-9999,ifelse(b=-9999,d,as.matrix(b)),as.matrix(r))
的东西也会有所帮助。嘿,谢谢您的回答,问题是,我的数据帧没有相同的长度。另外,我只想替换数据框中的一些列,而不是整个data.frame。很不幸,你的回答给了我一个错误信息。我知道我可以对data.frame进行子集。我只是想找一个简短的答案。@user3330494:那么你需要澄清你的问题很多。。。因为你的评论完全改变了我对它的理解。如果你问一个新的问题会更好:)嘿,谢谢。我用我的数据帧试过了,但是我得到了这个错误消息:wrapup期间出错:无法将类型“promise”强制为类型“character”的向量wrapup期间出错:目标上下文不在堆栈上wrapup期间出错:无法将类型“promise”强制为类型“character”的向量wrapup期间出错:目标上下文不在堆栈上我猜这里的问题也是,我的数据帧没有相同的长度?