我有一个如下所示的数据框列表:
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
答案 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)