2012-01-17 7 views
0

いくつかの外部ファイルを読み、いくつかの列を抽出し、欠損値をゼロで完成させなければならない。したがって、最初のファイルが$ Name:a、b、c、dの列と離散値を持つ$ Areaの列にある場合、 2番目のファイルがいくつかの列にあります。私は、このような、このデータフレームを作成する必要があり、さらにファイルのためのように、B、D、E、Fおよび:R行列を作成する

 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)) 

問題は、列名と各値の「同期」です。

いくつかの提案がありますか?

私のコードの結果が明らかでない場合は、私が扱うファイルをアップロードすることもできます。

ベスト

答えて

1

最も安全な名前のトラックを失うことはありません:彼らは...間違った順序で

を戻すことができますが、背の高いdata.frameにすべてのあなたのdata.framesを連結することができます、do.call(rbind, ...)とし、dcastでワイドdata.frameに変換します。

# 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") 
+0

ありがとうございます!私は私の問題を解決した!私は_reshape2_パッケージを完全に無視しますが、今私は慎重にそれを勉強すると思います! – Riccardo

関連する問題