0

ユーザー、

結果にNULLのdata.framesがありますが、NULLにしたくありません。最初と同じ(変更なし)にしてほしい。私はファイルのリストに取り組んでおり、私のコードの目的は、すべてのNAを他のdata.framesからのデータで埋めることです(最良の相関係数による)。これが小さな例です:

これらが私の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と最も相関の高いファイル(この例ではST2とST3の間)のデータをST1に入力する必要があることです。

ST3にはここにデータがないため、相関係数を設定できません。したがって、ST3からのNAを埋めることはできず、ST3を使用して別のファイルを埋めることもできません。したがって、ST3は必要に応じて使用できません。それでも、すべてのコードでST3を変更しないでおく必要があります。したがって、私のコードの問題は、データがなく、NAのみのdata.framesに起因します。

今のところ、私のコードは「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の場合、「リフィル」でNULLにしたくないのですが、入力と同じにする必要があります。入力と出力の間でdata.framesの同じ次元を持つためにこれが必要です。それらがNULLの場合(今のところのようですが、理由がわかりません。これを変更したいのですが)、他のdata.framesのように10行ではなく、このdata.frameに0行があります。

したがって、関数「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
4

1 に答える 1

2

どうですか

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

もちろん、これは、たとえば1999NAのベクトルと1つの数値に問題がないことを前提としています。

于 2012-06-07T11:31:23.370 に答える