[英]rename columns on a list of dataframes respect to names of df list with tidy functions
我想使用 tidyverse 重命名帶有 Tibbles 的列表中的某些列,以考慮我在 map function 調用中使用的元素的名稱。 例子:
c("star","wars") %>%
set_names() %>%
map(~starwars %>%
mutate(col_1 = .x) %>% #this as an example for the use of other functions that I have to use in the real data
select(col_1 ,everything()) %>%
rename_at(vars(name:eye_color), list(~str_c(.,"_",.x)))) <- the issue
結果:
$star
# A tibble: 87 x 15
col_1 name_name height_height mass_mass hair_color_hair~
<chr> <chr> <int> <dbl> <chr>
1 star Luke Sky~ 172 77 blond
2 star C-3PO 167 75 NA
3 star R2-D2 96 32 NA
4 star Darth Va~ 202 136 none
5 star Leia Org~ 150 49 brown
6 star Owen Lars 178 120 brown, grey
7 star Beru Whi~ 165 75 brown
8 star R5-D4 97 32 NA
9 star Biggs Da~ 183 84 black
10 star Obi-Wan ~ 182 77 auburn, white
# ... with 77 more rows, and 10 more variables:
# skin_color_skin_color <chr>, eye_color_eye_color <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>,
# species <chr>, films <list>, vehicles <list>,
# starships <list>
$wars
# A tibble: 87 x 15
col_1 name_name height_height mass_mass hair_color_hair~
<chr> <chr> <int> <dbl> <chr>
1 wars Luke Sky~ 172 77 blond
2 wars C-3PO 167 75 NA
3 wars R2-D2 96 32 NA
4 wars Darth Va~ 202 136 none
5 wars Leia Org~ 150 49 brown
6 wars Owen Lars 178 120 brown, grey
7 wars Beru Whi~ 165 75 brown
8 wars R5-D4 97 32 NA
9 wars Biggs Da~ 183 84 black
10 wars Obi-Wan ~ 182 77 auburn, white
# ... with 77 more rows, and 10 more variables:
# skin_color_skin_color <chr>, eye_color_eye_color <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>,
# species <chr>, films <list>, vehicles <list>,
# starships <list>
我想要創建的:
$star
# A tibble: 87 x 15
col_1 name_star height_star mass_star hair_color_star~
<chr> <chr> <int> <dbl> <chr>
1 star Luke Sky~ 172 77 blond
2 star C-3PO 167 75 NA
3 star R2-D2 96 32 NA
4 star Darth Va~ 202 136 none
5 star Leia Org~ 150 49 brown
6 star Owen Lars 178 120 brown, grey
7 star Beru Whi~ 165 75 brown
8 star R5-D4 97 32 NA
9 star Biggs Da~ 183 84 black
10 star Obi-Wan ~ 182 77 auburn, white
# ... with 77 more rows, and 10 more variables:
# skin_color_star <chr>, eye_color_star <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>,
# species <chr>, films <list>, vehicles <list>,
# starships <list>
$wars
# A tibble: 87 x 15
col_1 name_wars height_wars mass_wars hair_color_wars~
<chr> <chr> <int> <dbl> <chr>
1 wars Luke Sky~ 172 77 blond
2 wars C-3PO 167 75 NA
3 wars R2-D2 96 32 NA
4 wars Darth Va~ 202 136 none
5 wars Leia Org~ 150 49 brown
6 wars Owen Lars 178 120 brown, grey
7 wars Beru Whi~ 165 75 brown
8 wars R5-D4 97 32 NA
9 wars Biggs Da~ 183 84 black
10 wars Obi-Wan ~ 182 77 auburn, white
# ... with 77 more rows, and 10 more variables:
# skin_color_wars <chr>, eye_color_wars <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>,
# species <chr>, films <list>, vehicles <list>,
# starships <list>
出於某種原因,rename_at 將“.x”視為“。” 來自列的名稱,而不是來自 map。 怎么可能利用map function的.x?
一種解決方法是在rename_at()
中使用匿名 function 而不是公式來避免.x
和.
指的是相同的 object。 您還可以對map()
function 和rename_at()
中的波浪號使用匿名 function 。
c("star","wars") %>%
set_names() %>%
map(~starwars %>%
mutate(col_1 = .x) %>%
select(col_1 ,everything()) %>%
rename_at(vars(name:eye_color), function(var) str_c(var, "_", .x)))
$star
# A tibble: 87 x 15
col_1 name_star height_star mass_star hair_color_star skin_color_star
<chr> <chr> <int> <dbl> <chr> <chr>
1 star Luke Sky~ 172 77 blond fair
2 star C-3PO 167 75 NA gold
3 star R2-D2 96 32 NA white, blue
4 star Darth Va~ 202 136 none white
5 star Leia Org~ 150 49 brown light
6 star Owen Lars 178 120 brown, grey light
7 star Beru Whi~ 165 75 brown light
8 star R5-D4 97 32 NA white, red
9 star Biggs Da~ 183 84 black light
10 star Obi-Wan ~ 182 77 auburn, white fair
# ... with 77 more rows, and 9 more variables: eye_color_star <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>, species <chr>,
# films <list>, vehicles <list>, starships <list>
$wars
# A tibble: 87 x 15
col_1 name_wars height_wars mass_wars hair_color_wars skin_color_wars
<chr> <chr> <int> <dbl> <chr> <chr>
1 wars Luke Sky~ 172 77 blond fair
2 wars C-3PO 167 75 NA gold
3 wars R2-D2 96 32 NA white, blue
4 wars Darth Va~ 202 136 none white
5 wars Leia Org~ 150 49 brown light
6 wars Owen Lars 178 120 brown, grey light
7 wars Beru Whi~ 165 75 brown light
8 wars R5-D4 97 32 NA white, red
9 wars Biggs Da~ 183 84 black light
10 wars Obi-Wan ~ 182 77 auburn, white fair
# ... with 77 more rows, and 9 more variables: eye_color_wars <chr>,
# birth_year <dbl>, sex <chr>, gender <chr>, homeworld <chr>, species <chr>,
# films <list>, vehicles <list>, starships <list>
對於后代, rename_at()
已被dplyr版本 1.0.0 中的rename_with()
取代(但不會消失)。 rename_with()
代碼如下所示:
... %>%
rename_with(.fn = function(var) str_c(var, "_", .x), .cols = name:eye_color))
使用@aosmith 答案的替代方法是強制表達 defuse 表達式:
library(rlang)
c("star","wars") %>%
set_names() %>%
map(~starwars %>%
mutate(col_1 = .x) %>%
select(col_1 ,everything()) %>%
rename_at(vars(name:eye_color), list(~str_c(.,"_",!!quo(.x)))))
我認為具有不同符號的匿名 function 絕對是更安全,更清晰的方法,但這旨在表明它是可能的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.