我有两个数据框列表。在每个列表中,数据框都有一个具有相同名称和值的列。举个例子:
x <- list(data.frame(i=as.character(1:5),x=rnorm(5),z=rnorm(5)),
data.frame(i=as.character(1:5),x=rnorm(5),z=rnorm(5)))
y <- list(data.frame(i=as.character(5:1),x1=rnorm(5),z1=rnorm(5)),
data.frame(i=as.character(5:1),x1=rnorm(5),z1=rnorm(5)))
我想将两个列表合并为一个,这样新列表的每个元素都是一个包含以下列的数据框:i, x, z, x1, z1
)。那就是我想要一个包含两个数据框的列表,每个数据框有五行和我提到的五列。我找不到解决方案(例如,找到了如何在一个 df 的列表中连接 dfs)。我想使用 lapply
并传递函数 merge(x,y, by= i)
,但我不知道第一个参数(即使用的数据)应该是什么。
请注意,公共列中的值的顺序不同(在示例中它们是相反的,但在我的数据中它们是混合的)。所以让我知道您的解决方案是否需要先订购该列。谢谢。
答案 0 :(得分:5)
library(tidyverse)
map2(x, y, ~left_join(.x, .y, by = 'i'))
#> [[1]]
#> i x z x1 z1
#> 1 1 -0.8773188 1.204293 1.2809946 0.9016632
#> 2 2 -0.4091583 -1.128325 0.7973242 -0.1010260
#> 3 3 1.3747095 0.784787 -1.6927698 -1.1568878
#> 4 4 0.7565917 -1.104594 1.0663122 -0.1439810
#> 5 5 0.9662782 -1.039493 -0.2620102 -0.4941850
#>
#> [[2]]
#> i x z x1 z1
#> 1 1 0.7871544 -1.0974764 1.2926863 0.99399623
#> 2 2 1.3705341 -0.1047783 1.3612606 -0.01155390
#> 3 3 0.9984027 -0.2466980 0.4554107 -1.38307942
#> 4 4 0.7096952 0.7500738 -0.4586198 0.02311739
#> 5 5 0.1883204 -0.6399546 0.1496794 -0.43233764
它的 baseR 等价物
Map(function(.x, .y) merge(.x, .y, by = 'i'), x, y)
#> [[1]]
#> i x z x1 z1
#> 1 1 1.163081705 0.71855088 0.7981572 0.1029179
#> 2 2 0.876645119 -0.08615626 0.7299087 0.9782025
#> 3 3 -1.460452798 -0.14551233 -0.3380226 -1.1168602
#> 4 4 -0.004574267 -0.36117459 0.2183281 -0.9045827
#> 5 5 -0.836010524 0.12336598 -0.9046551 -0.2670896
#>
#> [[2]]
#> i x z x1 z1
#> 1 1 -1.1605742 0.3233873 -0.16685367 -1.0579590
#> 2 2 1.5723944 0.5120253 -0.66373500 0.3241323
#> 3 3 -1.5562135 1.1251436 0.06805823 -2.2889400
#> 4 4 0.2782484 0.4134606 -0.11763939 -0.9060669
#> 5 5 -0.4821373 -0.7170258 0.72466946 -1.4457480
由 reprex package (v2.0.0) 于 2021 年 6 月 5 日创建
答案 1 :(得分:4)
看起来这就是你想要的:
map2(x, y, ~ inner_join(.x, .y))
[[1]]
i x z x1 z1
1 1 0.7715183 -0.6933826 -0.3335239 0.5957587
2 2 -0.3824746 -0.7248827 -1.6736241 -1.2248904
3 3 0.3412777 -0.3711940 0.9334678 0.4043867
4 4 -0.4225862 -1.6653314 1.0369985 1.1808140
5 5 0.7468157 0.1704126 -0.1470796 -1.6237296
[[2]]
i x z x1 z1
1 1 0.69264103 -0.6640663 -0.2253319 0.26323254
2 2 -0.07861775 0.7914119 0.3725911 0.02854667
3 3 -0.86588724 -0.5519633 -1.5114177 -0.14283509
4 4 1.16069947 1.1299540 -0.4207173 -1.15829758
5 5 2.13867104 -0.9668079 0.1082068 -2.74714297
答案 2 :(得分:2)
使用 free(arr); //because it's not an array of pointers of structs
和 {dplyr}
{purrr}
答案 3 :(得分:2)
使用 data.table
library(data.table)
Map(function(u, v) setDT(u)[v, on = .(i)], x, y)
答案 4 :(得分:0)
我认为我们还可以使用以下解决方案:
library(purrr)
map2(x, y, ~ .x %>% bind_cols(.y %>% select(-i)))
[[1]]
i x z x1 z1
1 1 0.17590858 -2.5917377 -0.5603591 0.5810495
2 2 0.03199955 -0.1387498 -0.5948580 -1.5914561
3 3 -1.51798345 -0.1991066 0.5550439 0.9111812
4 4 0.03178260 2.4638499 -1.1169747 0.6084738
5 5 2.41686436 -0.7952663 0.4207237 0.5133366
[[2]]
i x z x1 z1
1 1 -0.07731912 -0.08303112 1.2116506 -1.0381454
2 2 -0.88351320 -1.50888504 0.8762129 1.5319386
3 3 -0.04033662 0.48264589 -0.3644170 -1.3051433
4 4 0.81795108 0.22947344 0.7192894 -1.2796247
5 5 1.19298096 2.29746662 0.9020253 0.8600827