cbind具有不同行数的2个数据帧

min*_*min 11 r cbind

我有两个名为h和的列表g.它们每个包含244个数据帧,它们如下所示:

h[[1]]
   year  avg    hr   sal
1  2010  0.300  31   2000
2  2011  0.290  30   4000
3  2012  0.275  14    600
4  2013  0.280  24    800 
5  2014  0.295  18   1000
6  2015  0.330  26   7000
7  2016  0.315  40   9000

g[[1]]
   year  pos  fld     
1  2010  A   0.990
2  2011  B   0.995
3  2013  C   0.970
4  2014  B   0.980
5  2015  D   0.990
Run Code Online (Sandbox Code Playgroud)

我想要cbind这两个数据帧.但是如您所见,它们具有不同的行数.我想组合这些数据帧,以便将具有相同年份的行组合在一行中.我希望空的空间充满NA.我期望的结果如下:

   year  avg    hr   sal   pos   fld
1  2010  0.300  31   2000   A   0.990
2  2011  0.290  30   4000   B   0.995
3  2012  0.275  14    600   NA    NA
4  2013  0.280  24    800   C   0.970
5  2014  0.295  18   1000   B   0.980
6  2015  0.330  26   7000   D   0.990
7  2016  0.315  40   9000   NA    NA
Run Code Online (Sandbox Code Playgroud)

另外,我想对每个列表中的所有244个数据帧重复此操作,h并且g.我想创建一个final包含244个组合数据帧的新列表.

我怎样才能做到这一点...?所有答案将不胜感激:)

A.Y*_*iha 13

我想你应该改用merge:

merge(df1, df2, by="year", all = T)
Run Code Online (Sandbox Code Playgroud)

对于您的数据:

df1 = data.frame(matrix(0, 7, 4))
names(df1) = c("year", "avg", "hr", "sal")
df1$year = 2010:2016
df1$avg = c(.3, .29, .275, .280, .295, .33, .315)
df1$hr = c(31, 30, 14, 24, 18, 26, 40)
df1$sal = c(2000, 4000, 600, 800, 1000, 7000, 9000)
df2 = data.frame(matrix(0, 5, 3))
names(df2) = c("year", "pos", "fld")
df2$year = c(2010, 2011, 2013, 2014, 2015)
df2$pos = c('A', 'B', 'C', 'B', 'D')
df2$fld = c(.99,.995,.97,.98,.99)
Run Code Online (Sandbox Code Playgroud)

cbind意味着column-bind两个dataframes在所有意义上都是兼容的.但是你想要做的是实际的merge,你希望两个数据框中的元素不被丢弃,而你想要的是缺失的值NA.


akr*_*run 5

我们可以使用Mapwith cbind.fill(from rowr) 来cbind连接 'h' 和 'g' 中相应的 'data.frame'。

library(rowr)
Map(cbind.fill, h, g, MoreArgs = list(fill=NA))
Run Code Online (Sandbox Code Playgroud)

更新

根据预期的输出显示,OP似乎想要一个merge而不是cbind

f1 <- function(...) merge(..., all = TRUE, by = 'year')
Map(f1, h, g)
#[[1]]
#  year   avg hr  sal  pos   fld
#1 2010 0.300 31 2000    A 0.990
#2 2011 0.290 30 4000    B 0.995
#3 2012 0.275 14  600 <NA>    NA
#4 2013 0.280 24  800    C 0.970
#5 2014 0.295 18 1000    B 0.980
#6 2015 0.330 26 7000    D 0.990
#7 2016 0.315 40 9000 <NA>    NA
Run Code Online (Sandbox Code Playgroud)

或者正如 @Colonel Beauvel 提到的,这可以变得紧凑

Map(merge, h, g, by='year', all=TRUE)
Run Code Online (Sandbox Code Playgroud)

数据

h <- list(structure(list(year = 2010:2016, avg = c(0.3, 0.29, 0.275, 
0.28, 0.295, 0.33, 0.315), hr = c(31L, 30L, 14L, 24L, 18L, 26L, 
 40L), sal = c(2000L, 4000L, 600L, 800L, 1000L, 7000L, 9000L)), .Names = c("year", 
 "avg", "hr", "sal"), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6", "7")))

g <- list(structure(list(year = c(2010L, 2011L, 2013L, 2014L, 2015L
), pos = c("A", "B", "C", "B", "D"), fld = c(0.99, 0.995, 0.97, 
0.98, 0.99)), .Names = c("year", "pos", "fld"), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5")))
Run Code Online (Sandbox Code Playgroud)