Добавить строку связать несколько фреймов данных с различными строками и столбцами
Я читаю много файлов данных с похожими (не идентичными) столбцами. От 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