R создать матрицу - PullRequest
       18

R создать матрицу

0 голосов
/ 18 января 2012

Мне нужно прочитать некоторые внешние файлы, извлечь некоторые столбцы и заполнить пропущенные значения нулями. Так что если первый файл имеет в столбце $ Name: a, b, c, d и столбец $ Area с дискретными значениями; второй файл имеет в некотором столбце: 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))

Проблема в "синхронизации" между именем столбца и каждым значением.

У вас есть предложение ??

Если мой код не дает четкого результата, я также могу загрузить файлы, с которыми работаю.

Best

1 Ответ

1 голос
/ 18 января 2012

Самое безопасное - никогда не терять имена: их можно вернуть в неправильном порядке ...

Вы можете объединить все свои 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" )
...