追加行绑定具有不同行和列的多个数据框
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
包使用 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
我正在阅读许多具有相似(不相同)列的数据文件。 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
包使用 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