2016-05-30 7 views
1

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

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

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

E.g.

df1 имеет столбцы "глубины", "GR_norm", "NeuHyCorr", "DenHyCorr", "ДТ", "UWI"

df2 имеет столбцы "глубины", "GR_norm", "DenHyCorr", " NeuHyCorr», "PHIE", "РРТ", "UWI"

DF3 имеет столбцы "глубины", "GR_norm", "DenHyCorr", "NeuHyCorr", "РРТ", "Rocktype", "UWI"

.....

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

если (wellno == 1) welldata < - темп еще welldata < - rbind (welldata, температура)

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

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

Пробовал merge() вместо rbind неудачей.

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

+0

использовать 'dplyr :: bind_rows()' – coffeinjunky

ответ

3

Использование 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 
+0

для (ЯО в 1: nwells) {... temp <- read.table (lasfile [nw], header = T) ... if (nw == 1) welldata <- temp else welldata <- rbind.fill (list (welldata, temp)) ...} Работает Что ж!!! Благодаря! –

0

С 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 

Для многих dataframes, хранить их в списке (или вектор) и объединить его с 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