繁体   English   中英

使用 map2 从列表中的一个 dataframe 添加一列到另一个列表中的另一个 dataframe

[英]Add a column from one dataframe in a list to another dataframe in another list with map2

我有两个包含不同数据框的列表(原始数据每个列表有 70 个数据框,总计 200 万行)。

df1 <- data.frame(colA = LETTERS[1:5], colB = seq(1,5))
df2 <- data.frame(colA = LETTERS[6:10], colB = seq(6,10))
list1 <- list(df1,df2)
df3 <- data.frame(colA = LETTERS[1:5], colB = seq(11,15))
df4 <- data.frame(colA = LETTERS[6:10], colB = seq(16,20))
list2 <- list(df3,df4)

我想创建一个新列表(例如desired_list )或更新现有的list1 ,从list2的每个 dataframe 添加colBdf3df4 )相应地命名新列并重新命名旧列。 list1list2具有相同数量的数据帧,每个数据帧具有相同的行数( df1具有相同的df3行数, df2具有相同的df4行数,依此类推)。 所需的 output 应如下所示。

desired_df1 <- data.frame(colA = LETTERS[1:5], colB_1 = seq(1,5), colB_2 = seq(11,15))
desired_df2 <- data.frame(colA = LETTERS[6:10], colB_1 = seq(6,10), colB_2 = seq(16,20))
desired_list <- list(desired_df1,desired_df2)

我想我可以用purrr::map2做到这一点,但我对列表不是很熟悉,而且我在map2格式和索引方面遇到困难。 到目前为止我试过:

desired_list <- lapply(list1, 
                       function(df) {purrr::map2(.x = list1, .y = list2, .f = list1$colB_2 <- list2$colB)})

但我得到:

Error in `as_mapper()`:
! Can't convert `.f`, NULL, to a function.

像下面这样的东西:

map2(list1, list2,
     ~data.frame(colA = .x$colA,
                 colB_1 = .x$colB,
                 colB_2 = .y$colB))

##> [[1]]
##>   colA colB_1 colB_2
##> 1    A      1     11
##> 2    B      2     12
##> 3    C      3     13
##> 4    D      4     14
##> 5    E      5     15
##> 
##> [[2]]
##>   colA colB_1 colB_2
##> 1    F      6     16
##> 2    G      7     17
##> 3    H      8     18
##> 4    I      9     19
##> 5    J     10     20




您可以为此使用普通的旧Map

Map(function(a, b) { a$colB_2 <- b$colB; a }, list1, list2)
#> [[1]]
#>   colA colB colB_2
#> 1    A    1     11
#> 2    B    2     12
#> 3    C    3     13
#> 4    D    4     14
#> 5    E    5     15
#> 
#> [[2]]
#>   colA colB colB_2
#> 1    F    6     16
#> 2    G    7     17
#> 3    H    8     18
#> 4    I    9     19
#> 5    J   10     20

或者也可以从list2中提取colBtransform list1

 Map(transform, list1, colB_2 = lapply(list2, `[[`, "colB"))

-输出

[[1]]
  colA colB colB_2
1    A    1     11
2    B    2     12
3    C    3     13
4    D    4     14
5    E    5     15

[[2]]
  colA colB colB_2
1    F    6     16
2    G    7     17
3    H    8     18
4    I    9     19
5    J   10     20

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM