r-使用整洁函数根据df列表的名称重命名数据帧列表上的列



我想使用tidyverse重命名一些列在与Tibbles关于元素I的名称的列表中在映射函数调用中使用。示例:

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函数的.x呢?

一种解决方法是在rename_at()中使用匿名函数而不是公式,以避免.x.引用同一对象的问题。您也可以为map()函数和rename_at()中的波浪号使用匿名函数。

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>

dplyr1.0.0版本中,rename_at()已被rename_with()取代(但不会消失(。rename_with()代码看起来像:

... %>%
rename_with(.fn = function(var) str_c(var, "_", .x), .cols = name:eye_color))

使用@aosmith的答案的另一种选择是强制表达一个化解表达式:

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)))))

我认为使用不同符号的匿名函数肯定是更安全、更清晰的方法,但这是为了表明这是可能的。

最新更新