簡體   English   中英

重命名數據框列表上的列,以使用整潔函數的 df 列表的名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM