用户,
我的data.frames在我的结果中是NULL,但我不希望它们为NULL。我希望它们与开头相同(不变)。我正在处理一个文件列表,我的代码的目的是用我的其他data.frames中的数据填充所有NA(根据最佳相关系数)。这是一个小例子:
想象一下,这些是我的3个输入数据帧(每行10行):
ST1 <- data.frame(x1=c(1:10))
ST2 <- data.frame(x2=c(1:5,NA,NA,8:10))
ST3 <- data.frame(x3=c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
这里的目的是,例如,如果在ST1中存在NA,则ST1必须填充来自ST1的最佳相关文件的数据(在该示例中在ST2和ST3之间)。)
由于ST3这里没有数据,我不能有任何相关系数。因此ST3中的NA无法填充,ST3也不能用于填充另一个文件。所以ST3没有用,如果你想。不过我想在所有代码中保持ST3不变。 因此,我的代码中的问题来自没有数据的data.frames,因此只有NAs。
目前我的代码会将此代码用于“重新填充”(我的代码结束)(在我的data.frames中填充NA):
ST1 <- data.frame(x1=c(1:10))
ST2 <- data.frame(x2=c(1:5,6,7,8:10))
ST3 <- NULL
但实际上,我想要“重新填充”这个结果:
ST1 <- data.frame(x1=c(1:10))
ST2 <- data.frame(x2=c(1:5,6,7,8:10))
ST3 <- data.frame(x3=c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA))
因此对于只有NA的data.frames,我不希望它们在“refill”中为NULL,但我希望它们与输入中的相同。我需要它在输入和输出之间具有相同的data.frames维度。 如果它们是NULL(就像目前一样,但我不明白为什么,我想改变它),这个data.frame中将有0行而不是其他data.frames的10行。
所以我觉得我的代码在函数“process.all”或“na.fill”或者“lst”中有问题。
这是我的代码,它是一个可重现的示例,供您了解我的错误(您将在head(refill)
中看到ST2设置为NULL)。
对不起,如果它有点长,但我的错误取决于以前使用的其他功能。希望你能理解我的问题和我想要做的事情。谢谢你的帮助!
(有关信息,在函数“process.all”和“na.fill”中:x是我要填充的data.frame,y是用于填充x的文件(所以最好的相关文件用x))。
杰弗里
# my data for example
DF1 <- data.frame(x1=c(NA,NA,rnorm(3:20)),x2=c(31:50))
write.table(DF1,"ST001_2008.csv",sep=";")
DF2 <- data.frame(x1=c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,rnorm(1:10)),x2=c(1:20))
write.table(DF2,"ST002_2008.csv",sep=";")
DF3 <- data.frame(x1=rnorm(81:100),x2=NA)
write.table(DF3,"ST003_2008.csv",sep=";")
DF4 <- data.frame(x1=c(21:40),x2=rnorm(1:20))
write.table(DF4,"ST004_2008.csv",sep=";")
# Correlation table
corhiver2008capt1 <- read.table(text=" ST001 ST002 ST003 ST004
ST001 1.0000000 NA -0.4350665 0.3393549
ST002 NA NA NA NA
ST003 -0.4350665 NA 1.0000000 -0.4992513
ST004 0.3393549 NA -0.4992513 1.0000000",header=T)
lst <- lapply(list.files(pattern="\\_2008.csv$"), read.table,sep=";", header=TRUE, stringsAsFactors=FALSE)
Stations <-c("ST001","ST002","ST003","ST004")
names(lst) <- Stations
# searching the highest correlation for each data.Frame
get.max.cor <- function(station, mat){
mat[row(mat) == col(mat)] <- -Inf
m <- max(mat[station, ],na.rm=TRUE)
if (is.finite(m)) {return(which( mat[station, ] == m ))}
else {return(NA)}
}
# fill the data.frame with the data.frame which has the highest correlation coefficient
na.fill <- function(x, y){
if(all(!is.finite(y[1:10,1]))) return(y)
i <- is.na(x[1:10,1])
xx <- y[1:10,1]
new <- data.frame(xx=xx)
x[1:10,1][i] <- predict(lm(x[1:10,1]~xx, na.action=na.exclude),new)[i]
x
}
process.all <- function(df.list, mat){
f <- function(station)
na.fill(df.list[[ station ]], df.list[[ max.cor[station] ]])
g <- function(station){
x <- df.list[[station]]
if(any(!is.finite(x[1:10,1]))){
mat[row(mat) == col(mat)] <- -Inf
nas <- which(is.na(x[1:10,1]))
ord <- order(mat[station, ], decreasing = TRUE)[-c(1, ncol(mat))]
for(y in ord){
if(all(!is.na(df.list[[y]][1:10,1][nas]))){
xx <- df.list[[y]][1:10,1]
new <- data.frame(xx=xx)
x[1:10,1][nas] <- predict(lm(x[1:10,1]~xx, na.action=na.exclude), new)[nas]
break
}
}
}
x
}
n <- length(df.list)
nms <- names(df.list)
max.cor <- sapply(seq.int(n), get.max.cor, corhiver2008capt1)
df.list <- lapply(seq.int(n), f)
df.list <- lapply(seq.int(n), g)
names(df.list) <- nms
df.list
}
refill <- process.all(lst, corhiver2008capt1)
refill <- as.data.frame(refill) ########## HERE IS THE PROBLEM ######
refill
答案 0 :(得分:2)
怎么样
if(sum(!is.na(ST3)) == 0) {
skip whatever you normally would do and go to the next vector
}
当然,这假设您没有任何问题,例如,1999年NAs的矢量和一个数值。