我想要合并两个大数据框列表。这是一个数据样本。
list1 = list(data.frame(Wvlgth = c(337, 337.5, 338, 338.5, 339, 339.5),
Global = c(".9923+00",".01245+00", ".0005+00", ".33421E+00", ".74361+00", ".129342+00"),
group = c(0,0,0,0,0,0)),
data.frame(Wvlgth = c(337, 337.5, 338, 338.5, 339, 339.5),
Global = c(".1284+00",".0098+00", ".7853+00", ".2311+00", ".1211+00", ".75345+00"),
group = c(1,1,1,1,1,1)))
list2 = list(data.frame(Wvlgth = c(337, 337.5, 338, 339),
time = c("13.445","13.445", "13.445", "13.445"),
IRD = c(.01324, .34565, .92395, .67489)),
data.frame(Wvlgth = c(337, 337.5, 338, 339),
time = c("13.45361","13.45361", "13.45361", "13.45361"),
IRD = c(.20981, .98703, .54092, .38567)))
我想将list1的每个数据帧与list2的每个数据帧合并为“Wvlgth”,以获得类似这样的内容:
Wvlgth time IRD Global group
337 13.445 0.01324 .9923+00 0
337.5 13.445 0.34565 .01245+00 0
338 13.445 0.92395 .0005+00 0
339 13.445 0.67489 .74361+00 0
337 13.45361 0.20981 .1284+00 1
337.5 13.45361 0.98703 .0098+00 1
338 13.45361 0.54092 .7853+00 1
338.5 13.45361 0.38567 .2311+00 1
我想使用内连接,因为list1的数据帧与list2的数据帧的行数不同。
我使用来自this question,的dplyr
尝试了接受的答案,但最终以奇怪的方式合并它们,我不太清楚发生了什么。看起来它是水平合并而不是垂直合并......?
> c(list1, list2) %>%
Reduce(function(dtf1, dtf2) inner_join(dtf1, dtf2, by="Wvlgth"), .)
Wvlgth Global.x group.x Global.y group.y time.x IRD.x time.y
1 337.0 .9923+00 0 .1284+00 1 13.445 0.01324 13.45361
2 337.5 .01245+00 0 .0098+00 1 13.445 0.34565 13.45361
3 338.0 .0005+00 0 .7853+00 1 13.445 0.92395 13.45361
4 339.0 .74361+00 0 .1211+00 1 13.445 0.67489 13.45361
IRD.y
1 0.20981
2 0.98703
3 0.54092
4 0.38567
答案 0 :(得分:3)
您可以同时遍历两个列表,并使用程序包 purrr 中的map2
加入每个元素。要返回单个data.frame而不是单独的已连接data.frames列表,您可以使用map2_df
。
library(purrr)
library(dplyr)
map2_df(list1, list2, inner_join, by = "Wvlgth")
Wvlgth Global group time IRD
1 337.0 .9923+00 0 13.445 0.01324
2 337.5 .01245+00 0 13.445 0.34565
3 338.0 .0005+00 0 13.445 0.92395
4 339.0 .74361+00 0 13.445 0.67489
5 337.0 .1284+00 1 13.45361 0.20981
6 337.5 .0098+00 1 13.45361 0.98703
7 338.0 .7853+00 1 13.45361 0.54092
8 339.0 .1211+00 1 13.45361 0.38567
答案 1 :(得分:1)
在基数R中,您可以将Map
的输出提供给do.call
/ rbind
。
do.call(rbind, Map(merge, list1, list2, by="Wvlgth"))
Wvlgth Global group time IRD
1 337.0 .9923+00 0 13.445 0.01324
2 337.5 .01245+00 0 13.445 0.34565
3 338.0 .0005+00 0 13.445 0.92395
4 339.0 .74361+00 0 13.445 0.67489
5 337.0 .1284+00 1 13.45361 0.20981
6 337.5 .0098+00 1 13.45361 0.98703
7 338.0 .7853+00 1 13.45361 0.54092
8 339.0 .1211+00 1 13.45361 0.38567
Map
合并两个列表中的相应data.frames,并返回一个data.frames列表。然后,这些data.frame将附加do.call
和rbind
。
如果数据集特别大,您可以使用rbindlist
中的data.table
执行追加:
library(data.table)
rbindlist(Map(merge, list1, list2, by="Wvlgth"))
返回data.table对象。