r-在tibble嵌套tibbles(列表列内部)中,如何更新tibbles以重命名具有通用名称的列



使用purrr,我将iris数据汇总到一个新的突变列表列中:

library(tidyverse)
my_tibble <-
iris %>%
nest(data = everything()) %>%
mutate(summary_tbl = map(.x = data,
~ .x %>%
group_by(Species) %>%
summarise(mean_by_cat = mean(Sepal.Length))))
my_tibble
#> # A tibble: 1 x 2
#>   data               summary_tbl     
#>   <list>             <list>          
#> 1 <tibble [150 x 5]> <tibble [3 x 2]>

由reprex软件包(v0.3.0(于2021-03-16创建

如果我们不测试datasummary_tbl,我们可以看到两者都包含一个tibble,具有一些重叠的列名(在本例中为Species(:

my_tibble %>%
pull(data)
## [[1]]
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows
my_tibble %>%
pull(summary_tbl)
## [[1]]
## # A tibble: 3 x 2
##   Species    mean_by_cat
## * <fct>            <dbl>
## 1 setosa            5.01
## 2 versicolor        5.94
## 3 virginica         6.59

有没有一种有效的方法可以重命名出现在my_tibble的列表列中的任何中的列名?例如,如果我们定义:

var_to_rename <- "Species"
new_name <- "my_grouping_var"

然后提供my_tibblevar_to_renamenew_name,我们如何通过编程获得以下内容?

my_tibble %>%
pull(data)
## [[1]]
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width my_grouping_var
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows
my_tibble %>%
pull(summary_tbl)
## [[1]]
## # A tibble: 3 x 2
##   my_grouping_var  mean_by_cat
## * <fct>            <dbl>
## 1 setosa            5.01
## 2 versicolor        5.94
## 3 virginica         6.59

很明显,在mutate部分之前,我本可以将Species重命名为my_grouping_var,但我的问题旨在事后重命名现有的tibble。

如果要使用函数,可以将rename()与卷曲-卷曲运算符({{}}(和冒号相等运算符(:=(一起使用:

foo = function(var_to_rename, new_name){
my_tibble %>% 
mutate(summary_tbl = map(summary_tbl, ~{
rename(.x, {{new_name}}:={{var_to_rename}})
}))
}
my_tibble2=foo("Species", "my_grouping_var")
my_tibble2 %>%
pull(summary_tbl)
#> [[1]]
#> # A tibble: 3 x 2
#>   my_grouping_var mean_by_cat
#>   <fct>                 <dbl>
#> 1 setosa                 5.01
#> 2 versicolor             5.94
#> 3 virginica              6.59

由reprex软件包(v1.0.0(于2021-03-16创建

关于如何在上的函数中使用dplyr的整洁求值的更多信息https://dplyr.tidyverse.org/articles/programming.html.

你可以做:

library(dplyr)
my_tibble <- my_tibble %>%
mutate(across(.fns = ~.[[1]] %>% 
rename_with(~new_name, all_of(var_to_rename)) %>% list()))
my_tibble %>% pull(summary_tbl)
#[[1]]
# A tibble: 3 x 2
#  my_grouping_var mean_by_cat
#* <fct>                 <dbl>
#1 setosa                 5.01
#2 versicolor             5.94
#3 virginica              6.59

相关内容

  • 没有找到相关文章

最新更新