我一直试图弄清楚这一整天,但我对循环的理解并不是最好的。 我基本上有3个数据帧。它们包含多个列。我想一次检查每个数据框。如果列中的一个值是-9999(NA),我想用其他数据帧中的值替换它(如果第二个数据帧中的相同值也是-9999,则它应取第3个值中的值) )。
我用if else想出来了。我只是无法将它变成for循环。所以我必须手动输入每一列,这需要花费很多时间,因为我有很多列有奇怪的名字。所以这是我的例子,简单的形式。也许有些人可以帮助我。非常感谢,Susi
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
答案 0 :(得分:1)
(编辑版,感谢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)]
答案 1 :(得分:0)
您可以在指定的r
中整理b
,d
,list
,然后按@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