Добавить строку связать несколько фреймов данных с различными строками и столбцами

Я читаю много файлов данных с похожими (не идентичными) столбцами. От 4 до 20 столбцов существуют в разных файлах.

Попытка создать одну строку data.frame, связывающую каждый файл с другими. Где совпадающие столбцы должны образовывать один столбец в результате. Ряды с отсутствующими столбцами получают NA.

В отличие от предыдущих вопросов: количество и точное имя столбцов данных известны "только" после прочтения каждого файла. Максимальное количество столбцов, которые будут находиться во фрейме выходных данных, необходимо генерировать при чтении данных.

Например

df1 имеет столбцы "DEPTH","GR_norm","NeuHyCorr", "DenHyCorr","DT", "UWI"

У df2 есть столбцы "DEPTH", "GR_norm", "DenHyCorr", "NeuHyCorr", "PHIE", "RRT", "UWI"

df3 имеет столбцы "DEPTH", "GR_norm", "DenHyCorr", "NeuHyCorr", "RRT", "Rocktype", "UWI"

.....

Я делаю rbind в цикле for: данные считываются в data.frame - temp в каждой итерации цикла и объединяются со следующим кодом

if (wellno == 1) welldata <- temp иначе welldata <- rbind (welldata, temp)

это терпит неудачу с

Ошибка в rbind(deparse.level, ...): номера столбцов аргументов не совпадают

Пытался merge() на месте rbind с провалом.

Я ожидаю увидеть welldata со всеми столбцами отдельных фреймов данных.

2 ответа

Решение

Использование plyr:

library(plyr)

df1 = data.frame(a=1:2,b=letters[1:2])
df2 = data.frame(b=letters[3:4],c=c('dog','cat'))

rbind.fill(list(df1, df2))
#   a b    c
#1  1 a <NA>
#2  2 b <NA>
#3 NA c  dog
#4 NA d  cat

Или же data.table использование пакета rbindlist с возможностью заполнения до TRUE (однако это даст вам объект data.table):

rbindlist(list(df1, df2), fill=T)
#    a b   c
#1:  1 a  NA
#2:  2 b  NA
#3: NA c dog
#4: NA d cat

С dplyr:

df1 = data.frame(a=1:2,b=letters[1:2])
df2 = data.frame(b=letters[3:4],c=c('dog','cat'))
bind_rows(df1, df2)
Source: local data frame [4 x 3]

      a     b      c
  (int) (chr) (fctr)
1     1     a     NA
2     2     b     NA
3    NA     c    dog
4    NA     d    cat

Для многих фреймов данных сохраните их в списке (или в векторе) и объедините их с Reduce, как в

# list of 10 different dataframes:
df_list <- lapply(1:10, 
             function(x) setNames(data.frame(rnorm(1)), sample(letters[1:3],1)))

Reduce(bind_rows, df_list)
Source: local data frame [10 x 3]

            a          b         c
        (dbl)      (dbl)     (dbl)
1  -1.6825270         NA        NA
2          NA -0.4742396        NA
3          NA  0.1676438        NA
4          NA  1.0191025        NA
5          NA -0.1836922        NA
6   0.1188567         NA        NA
7          NA  0.4464885        NA
8  -1.2886858         NA        NA
9   0.3945049         NA        NA
10         NA         NA 0.3039996
Другие вопросы по тегам