提问人:Chamkrai 提问时间:8/3/2022 最后编辑:benson23Chamkrai 更新时间:8/3/2022 访问量:49
使用 Tidyverse 从向量改变列出的数据帧中的新列
Mutate new column in a listed dataframes from a vector with Tidyverse
问:
考虑这个向量
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
我试过了,但没有任何结果。imap
map
编辑:
好的,我设法找到了解决方案
imap(listed_dfs, ~ bind_cols(.x, name = names[.y]))
但是,如果有更干净的方法,我仍然愿意接受其他建议
答:
1赞
Darren Tsai
8/3/2022
#1
您可以使用:map2
purrr
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 列表。map
lapply
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
评论