2012-01-17 2 views
0

Мне нужно прочитать некоторые внешние файлы, извлечь некоторые столбцы и заполнить недостающие значения нулями. Поэтому, если первый файл имеет в столбце $ Name: a, b, c, d и столбец $ Area с дискретными значениями; второй файл имеет в некоторой колонке: 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.frames в высокий data.frame , с do.call(rbind, ...), а затем преобразуйте его в широкий файл данных с 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") 
+0

Спасибо за ваше предложение !!! Я решил свою проблему !!! Я полностью игнорирую пакет _reshape2_, но теперь я думаю, что буду внимательно изучать его !!!! – Riccardo

Смежные вопросы