0

いくつかの外部ファイルを読み取り、いくつかの列を抽出し、欠落している値をゼロで完了する必要があります。したがって、最初のファイルがcolumn $ Nameにある場合:a、b、c、d、および個別の値を持つcolumn$Area。2番目のファイルはいくつかの列にあります:b、d、e、fなど。他のファイルについては、次のようなデータフレームを作成する必要があります。

        a      b      c      d      e   f
File1 value  value  value  value    0   0
File2   0    value    0    value  value  value

これは、私の問題をよりよく説明するために書いたダミーコードです。

listDFs <- list()
for(i in 1:10){
    listDFs[[i]] <-
        data.frame(Name=c(
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse="")),
                   c(paste(sample(letters,size=2,replace=TRUE),collapse=""))),
                   Area=runif(7))
}
lComposti <- sapply(listDFs, FUN = "[","Name")
dfComposti <- data.frame(matrix(unlist(lComposti),byrow=TRUE))
colnames(dfComposti) <- "Name"
dfComposti <- unique(dfComposti)
                                        #
## The CORE of the code
lArea <- list()
for(i in 1:10){
    lArea[[i]] <-
        ifelse(dfComposti$Name %in% listDFs[[i]]$Name, listDFs[[i]]$Area, 0)}
                                        #
mtxArea <- (matrix(unlist(lArea),nrow=c(10),ncol=dim(dfComposti)[1],byrow=TRUE))

問題は、列名と各値の間の「同期」に関するものです。

何か提案はありますか?

コードの結果が不明確な場合は、使用しているファイルをアップロードすることもできます。

一番

4

1 に答える 1

1

最も安全なのは、名前を見失うことは決してないということです。名前を間違った順序に戻す可能性があります...

すべてのdata.framesをでトールdata.frameに連結しdo.call(rbind, ...)てから、でワイドdata.frameに変換できdcastます。

# Add a File column to the data.frames
names( listDFs ) <- paste( "File", 1:length(listDFs) )
for(i in seq_along(listDFs)) {
  listDFs[[i]] <- data.frame( listDFs[[i]], file = names(listDFs)[i] )
}

# Concatenate them
d <- do.call( rbind, listDFs )

# Convert this tall data.frame to a wide one
# ("sum" is only needed if some names appear several times 
# in the same file: since you used "replace=TRUE" for the 
# sample data, it is likely to happen)
library(reshape2)
d <- do.call( rbind, listDFs )
d <- dcast( d, file ~ Name, sum, value.var="Area" )
于 2012-01-18T00:01:20.077 に答える