我有两个名为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
.
我们可以使用Map
with 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)
归档时间: |
|
查看次数: |
30659 次 |
最近记录: |