【问题标题】:return identical DF or vector instead of NULL返回相同的 DF 或向量而不是 NULL
【发布时间】:2012-06-07 08:35:26
【问题描述】:

用户,

我的结果中的 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。

目前我的代码会给出这个“refill”(我的代码结束)(在我的 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.frame,我不希望它们在“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

【问题讨论】:

  • 您能否尝试将其设为最小可重现的示例,即仍然存在问题的最短示例?
  • 我昨天也尝试减少我的代码以重现我的错误,但这个代码是我能够做的最小的代码有同样的错误。我已经删除了一半。但由于我真的不知道问题出在哪里,并且每个函数都依赖于前一个函数,所以我无法做一个更小的函数,再次抱歉。我只是认为问题出在“process.all”或“na.fill”中,其中 x 或 y 可能没有很好地定义。
  • 这里有点小,但我只是删除了有效的部分(用于计算相关矩阵)。我无法删除下一个函数,因为它们在错误所在的函数中使用
  • 同意需要大幅削减以明确问题所在。

标签: r dataframe na


【解决方案1】:

怎么样

if(sum(!is.na(ST3)) == 0) { 
skip whatever you normally would do and go to the next vector
}

当然,这假设您对 1999 NA 的向量和一个数值没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2018-11-28
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多