合并数据框列表中的数据框

时间:2015-10-20 05:56:23

标签: r dataframe

我有一个如下所示的数据框列表:

ls[[1]]
[[1]]

 month year   oracle
    1 2004 356.0000
    2 2004 390.0000
    3 2004 394.4286
    4 2004 391.8571 
 ls[[2]]
 [[2]]
 month year microsoft
    1 2004  339.0000
    2 2004  357.7143
    3 2004  347.1429
    4 2004  333.2857

如何创建如下所示的单个数据框:

 month year   oracle   microsoft
    1 2004 356.0000    339.0000
    2 2004 390.0000    357.7143
    3 2004 394.4286    347.1429
    4 2004 391.8571    333.2857

3 个答案:

答案 0 :(得分:7)

我们也可以使用Reduce

Reduce(function(...) merge(..., by = c('month', 'year')), lst)

使用@ Jaap的示例,如果值不相同,请使用all=TRUE中的merge选项。

Reduce(function(...) merge(..., by = c('month', 'year'), all=TRUE), ls)
#     month year   oracle microsoft   google
#1     1 2004 356.0000        NA       NA
#2     2 2004 390.0000  339.0000       NA
#3     3 2004 394.4286  357.7143 390.0000
#4     4 2004 391.8571  347.1429 391.8571
#5     5 2004       NA  333.2857 357.7143
#6     6 2004       NA        NA 333.2857

答案 1 :(得分:4)

如果adb forward tcp:4444 localabstract:/adb-hub adb connect 127.0.0.1:4444 Reduce列的值相同,则使用来自@ akrun的答案的merge / month代码将会很有效数据帧。但是,当它们不相同时(本答案末尾的示例数据)

year

将仅返回每个数据帧中常见的行:

Reduce(function(...) merge(..., by = c('month', 'year')), ls)

在这种情况下,当您想要包含所有行/观察时,您可以使用 month year oracle microsoft google 1 3 2004 394.4286 357.7143 390.0000 2 4 2004 391.8571 347.1429 391.8571 (如@akrun所示)或使用all=TRUE包中的full_join作为替代方案:

dplyr

这将导致:

library(dplyr)
Reduce(function(...) full_join(..., by = c('month', 'year')), ls) 
# or just:
Reduce(full_join, ls)

使用过的数据:

  month year   oracle microsoft   google
1     1 2004 356.0000        NA       NA
2     2 2004 390.0000  339.0000       NA
3     3 2004 394.4286  357.7143 390.0000
4     4 2004 391.8571  347.1429 391.8571
5     5 2004       NA  333.2857 357.7143
6     6 2004       NA        NA 333.2857

答案 2 :(得分:0)

你也可以按照以下方式do.call() ...

do.call(merge, ls)