追加行绑定具有不同行和列的多个数据框

Append row bind multiple data frames with varying rows and columns

我正在阅读许多具有相似(不相同)列的数据文件。 4 到 20 列存在于不同的文件中。

正在尝试创建单个 data.frame 行将每个文件绑定到其他文件。其中匹配列应在结果中形成单个列。缺少列的行得到 NA。

与前面的问题不同:读取每个文件后,数据列的数量和确切名称是已知的 'only'。读取数据时需要生成输出数据框中的最大列数。

例如

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"

.......

我在 for 循环中执行 rbind:数据被读入 data.frame - 每次循环迭代中的临时值并与以下代码合并

if (wellno == 1) welldata <- temp else welldata <- rbind(welldata, temp)

它失败了

Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match

尝试用 merge() 代替 rbind,但失败了。

我希望看到 welldata 包含各个数据框的所有列。

使用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 包使用 rbindlistTRUE 的填充选项(但是这会给你一个 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