tidyr unnest,在取消测试期间使用嵌套名称作为列名前缀

tidyr unnest,在取消测试期间使用嵌套名称作为列名前缀,r,tidyr,unnest,R,Tidyr,Unnest,在data.frame上运行unnest时,是否有方法将嵌套项的组名添加到其包含的各个列中(作为后缀或前缀)。或者重命名是否必须通过重命名手动完成 这与“取消测试”包含同名列的多个组尤其相关 在下面的示例中,baseaggregate命令做得很好(例如Petal.Length.mn),但是我找不到一个选项来获取unnest来做同样的事情 我将nest与purr::map一起使用,因为我希望能够灵活地混合函数,例如,计算两个变量的均值和标准差,并运行t测试来查看它们之间的差异 库(dplyr,w

data.frame
上运行
unnest
时,是否有方法将嵌套项的组名添加到其包含的各个列中(作为后缀或前缀)。或者重命名是否必须通过
重命名
手动完成

这与“取消测试”包含同名列的多个组尤其相关

在下面的示例中,
base
aggregate
命令做得很好(例如Petal.Length.mn),但是我找不到一个选项来获取
unnest
来做同样的事情

我将
nest
purr::map
一起使用,因为我希望能够灵活地混合函数,例如,计算两个变量的均值和标准差,并运行t测试来查看它们之间的差异


库(dplyr,warn.conflicts=FALSE)
msd_c 1 setosa 1.4620000 0.1736640 0.246000 0.1053856
#>2花色4.2600000 0.4699110 1.326000 0.1977527
#>3弗吉尼亚州5.5520000 0.5518947 2.0260000.2746501
虹膜%>%
选择(花瓣长度:种)%>%
组别(种类)%>%
tidyr::nest()%>%
变异(
Petal.Length=purrr::map(数据,~msd_df(.$Petal.Length)),
Petal.Width=purrr::map(数据,~msd_df(.$Petal.Width)),
相关性=purrr::map(数据,~broom::tidy(cor.test(.$Petal.Length,.$Petal.Width)),
) %>% 
选择(-data)%%>%
tidyr::unnest(c(花瓣.长度,花瓣.宽度,相关性),名称\修复=tidyr::tidyr \遗留)
#>#tibble:3 x 13
#>#类群:种[3]
#>物种mn sd mn1 sd1估计统计p值参数形态低
#>                               
#>1 setosa 1.46 0.174 0.246 0.105 0.332 2.44 1.86e-2 48 0.0587
#>2版本~4.26 0.470 1.33 0.198 0.787 8.83 1.27e-11 48 0.651
#>3维珍~5.55 0.552 2.03 0.275 0.322 2.36 2.25e-2 48 0.0481
#> # ... 还有3个变量:conf.high、method、alternative

由(v0.3.0)于2020年5月20日创建,要将多个函数应用于多个列,我将使用
/
处总结
在处变异而不是嵌套和取消测试数据

例如,在这种情况下,我们可以:

library(dplyr)
iris %>% 
  group_by(Species) %>% 
  summarise_at(vars(Petal.Length:Petal.Width), list(mn = mean, sd = sd))


#  Species    Petal.Length_mn Petal.Width_mn Petal.Length_sd Petal.Width_sd
#  <fct>                <dbl>          <dbl>           <dbl>          <dbl>
#1 setosa                1.46          0.246           0.174          0.105
#2 versicolor            4.26          1.33            0.470          0.198
#3 virginica             5.55          2.03            0.552          0.275
库(dplyr)
虹膜%>%
组别(种类)%>%
总结(变量(花瓣长度:花瓣宽度),列表(mn=平均值,sd=sd))
#物种花瓣。长度\ mn花瓣。宽度\ mn花瓣。长度\ sd花瓣。宽度\ sd
#                                                 
#1刚毛1.46 0.246 0.174 0.105
#2花色4.26 1.33 0.470 0.198
#3弗吉尼亚州5.55 2.03 0.552 0.275
这会自动为我们应用函数的列名添加前缀。此外,这相当于您尝试的
aggregate
函数的
dplyr
版本


另请注意,在即将发布的
dplyr
版本中,处的
summary_将很快被
所取代

要将多个函数应用于多个列,我将使用
/
处汇总
而不是嵌套和取消测试数据

例如,在这种情况下,我们可以:

library(dplyr)
iris %>% 
  group_by(Species) %>% 
  summarise_at(vars(Petal.Length:Petal.Width), list(mn = mean, sd = sd))


#  Species    Petal.Length_mn Petal.Width_mn Petal.Length_sd Petal.Width_sd
#  <fct>                <dbl>          <dbl>           <dbl>          <dbl>
#1 setosa                1.46          0.246           0.174          0.105
#2 versicolor            4.26          1.33            0.470          0.198
#3 virginica             5.55          2.03            0.552          0.275
库(dplyr)
虹膜%>%
组别(种类)%>%
总结(变量(花瓣长度:花瓣宽度),列表(mn=平均值,sd=sd))
#物种花瓣。长度\ mn花瓣。宽度\ mn花瓣。长度\ sd花瓣。宽度\ sd
#                                                 
#1刚毛1.46 0.246 0.174 0.105
#2花色4.26 1.33 0.470 0.198
#3弗吉尼亚州5.55 2.03 0.552 0.275
这会自动为我们应用函数的列名添加前缀。此外,这相当于您尝试的
aggregate
函数的
dplyr
版本


另请注意,在即将发布的
dplyr
版本中,
处的
summary_将很快被
所取代

您可以像下面那样使用
setNames
。这有点冗长,但似乎您计划为每个列指定每个函数,这可能会引起兴趣

iris %>% 
  select(Petal.Length:Species) %>% 
  group_by(Species) %>% 
  tidyr::nest() %>% 
  mutate(
    Petal.Length = purrr::map(data, ~ msd_df(.x$Petal.Length) %>%
                                setNames(paste0("Petal.Length.", names(.)))),
    Petal.Width = purrr::map(data, ~ msd_df(.$Petal.Width) %>%
                                setNames(paste0("Petal.Width.", names(.)))),
    Ratio = purrr::map(data, ~ msd_df(.$Petal.Length/.$Petal.Width) %>%
                               setNames(paste0("Ratio.", names(.))))
  ) %>% 
  select(-data) %>% 
  tidyr::unnest(c(Petal.Length, Petal.Width, Ratio))
# A tibble: 3 x 7
# Groups:   Species [3]
  Species    Petal.Length.mn Petal.Length.sd Petal.Width.mn Petal.Width.sd Ratio.mn Ratio.sd
  <fct>                <dbl>           <dbl>          <dbl>          <dbl>    <dbl>    <dbl>
1 setosa                1.46           0.174          0.246          0.105     6.91    2.85 
2 versicolor            4.26           0.470          1.33           0.198     3.24    0.312
3 virginica             5.55           0.552          2.03           0.275     2.78    0.407
iris%>%
选择(花瓣长度:种)%>%
组别(种类)%>%
tidyr::nest()%>%
变异(
Petal.Length=purrr::map(数据,~msd_df(.x$Petal.Length)%>%
设置名称(粘贴0(“花瓣长度”),名称(.),
花瓣宽度=purrr::map(数据,~msd_df(.$Petal.Width)%>%
设置名称(粘贴0(“花瓣宽度”),名称(.),
比率=purrr::map(数据,~msd_df(.$Petal.Length/$Petal.Width)%>%
集合名称(粘贴0(“比率”),名称()
) %>% 
选择(-data)%%>%
tidyr::unnest(c(花瓣长度、花瓣宽度、比率))
#一个tibble:3x7
#类群:种[3]
物种花瓣.Length.mn花瓣.Length.sd花瓣.Width.mn花瓣.Width.sd比率.mn比率.sd
1 setosa 1.46 0.174 0.246 0.105 6.91 2.85
2花色4.26 0.470 1.33 0.198 3.24 0.312
3弗吉尼亚州5.55 0.552 2.03 0.275 2.78 0.407
或者修改函数,使其能够像这样修改列名

msd_df_name <- function(x, name){
  bind_rows(c(mn = mean(x), sd = sd(x))) %>%
    setNames(paste0(name, ".", names(.)))
}

iris %>% 
  select(Petal.Length:Species) %>% 
  group_by(Species) %>% 
  tidyr::nest() %>% 
  mutate(
    Petal.Length = purrr::map(data, ~ msd_df_name(.x$Petal.Length, "Petal.Length")),
    Petal.Width = purrr::map(data, ~ msd_df_name(.$Petal.Width, "Petal.Width")),
    Ratio = purrr::map(data, ~ msd_df_name(.$Petal.Length/.$Petal.Width, "Ratio"))
  ) %>% 
  select(-data) %>% 
  tidyr::unnest(c(Petal.Length, Petal.Width, Ratio))
msd\u df\u name%
设置名称(粘贴0(名称,“.”,名称(.))
}
虹膜%>%
选择(花瓣长度:种)%>%
组别(种类)%>%
tidyr::nest()%>%
变异(
Petal.Length=purrr::map(数据,~msd_df_名称(.x$Petal.Length,“Petal.Length”),
Petal.Width=purrr::map(数据,~msd_df_名称(.$Petal.Width,“Petal.Width”),
Ratio=purrr::map(数据,~msd_df_名称(.$Petal.Length/$Petal.Width,“Ratio”))
) %>% 
选择(-data)%%>%
三分之三:未经测试(c)(Pet)