簡體   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