使用 Tidyverse 从向量改变列出的数据帧中的新列

Mutate new column in a listed dataframes from a vector with Tidyverse

提问人:Chamkrai 提问时间:8/3/2022 最后编辑:benson23Chamkrai 更新时间:8/3/2022 访问量:49

问:

考虑这个向量

names <- c("Jon", "Nancy")

以及具有相同长度的数据帧列表

listed_dfs <- list(tibble(X = sample(1:5),
                          Y = sample(1:5)),
                   tibble(X = sample(11:15),
                          Y = sample(11:15)))

我想在它们中的每一个中添加一个新列,并根据它们在向量中的位置命名。这样所需的输出将是:

[[1]]
# A tibble: 5 x 3
      X     Y name 
  <int> <int> <chr>
1     4     1 Jon  
2     2     5 Jon  
3     5     2 Jon  
4     3     4 Jon  
5     1     3 Jon  

[[2]]
# A tibble: 5 x 3
      X     Y name 
  <int> <int> <chr>
1    14    13 Nancy
2    11    14 Nancy
3    12    12 Nancy
4    15    11 Nancy
5    13    15 Nancy

我试过了,但没有任何结果。imapmap

编辑:

好的,我设法找到了解决方案

imap(listed_dfs, ~ bind_cols(.x, name = names[.y])) 

但是,如果有更干净的方法,我仍然愿意接受其他建议

r list dataframe 数据操作 purrr

评论


答:

1赞 Darren Tsai 8/3/2022 #1

您可以使用:map2purrr

map2(listed_dfs, names, ~ bind_cols(name = .y, .x))

[[1]]
# A tibble: 5 × 3
  name      X     Y
  <chr> <int> <int>
1 Jon       3     2
2 Jon       1     3
3 Jon       4     1
4 Jon       5     4
5 Jon       2     5

[[2]]
# A tibble: 5 × 3
  name      X     Y
  <chr> <int> <int>
1 Nancy    15    12
2 Nancy    13    14
3 Nancy    11    11
4 Nancy    14    13
5 Nancy    12    15

如果你的最终目标是绑定它们,你可以直接使用:bind_rows(..., .id = 'name')dplyr

bind_rows(set_names(listed_dfs, names), .id = 'name')

# A tibble: 10 × 3
   name      X     Y
   <chr> <int> <int>
 1 Jon       3     2
 2 Jon       1     3
 3 Jon       4     1
 4 Jon       5     4
 5 Jon       2     5
 6 Nancy    15    12
 7 Nancy    13    14
 8 Nancy    11    11
 9 Nancy    14    13
10 Nancy    12    15
1赞 benson23 8/3/2022 #2

如果你想用,我相信语法应该类似于。输出仍然是 tibbles 列表。maplapply

library(tidyverse)

map(seq_along(names), ~ bind_cols(listed_dfs[[.x]], name = names[.x]))

[[1]]
# A tibble: 5 × 3
      X     Y name 
  <int> <int> <chr>
1     2     1 Jon  
2     1     2 Jon  
3     4     3 Jon  
4     5     4 Jon  
5     3     5 Jon  

[[2]]
# A tibble: 5 × 3
      X     Y name 
  <int> <int> <chr>
1    12    14 Nancy
2    15    13 Nancy
3    11    11 Nancy
4    13    15 Nancy
5    14    12 Nancy