汇总旁边的变量

时间:2019-12-09 15:22:44

标签: r dplyr summarize

我正在寻找解决问题的方法。我可以通过手动重新排列来解决它。

Example code:

  library(dplyr)

    set.seed(1)
    Data <- data.frame(
      W = sample(1:10),
      X = sample(1:10),
      Y = sample(c("yes", "no"), 10, replace = TRUE),
      Z = sample(c("cat", "dog"), 10, replace = TRUE)
    )        
    #
    summarized <- Data %>% group_by(Z) %>% summarise_if(is.numeric,funs(mean,median),na.rm=T)

print(Data)

enter image description here

我希望输出如下所示,将每个函数应用于第一个col,然后将每个函数应用于第二个col,依此类推。我的代码反之亦然。

我当然可以重新排列列,但这不是Data Science的意思。我有数百个列,想要应用多个功能。

这就是我想要的:

summarized <- summarized[,c(1,2,4,3,5)] #best solution yet

enter image description here

我缺少任何论据吗?我敢打赌,有一个简单的解决方案或其他功能可以完成任务。 伙计们,谢谢!

2 个答案:

答案 0 :(得分:3)

一种选择是用足够的select_helpers后处理

library(dplyr)
summarized %>% 
    select(Z, starts_with('W'), everything())
# A tibble: 2 x 5
#  Z     W_mean W_median X_mean X_median
#  <fct>  <dbl>    <dbl>  <dbl>    <dbl>
#1 cat     5.25      5.5   3.75      3.5
#2 dog     5.67      5.5   6.67      7  

如果有100列,则一种方法是获取列名称的子字符串并排序

library(stringr)
summarized %>% 
         select(Z, order(str_remove(names(.), "_.*")))
# A tibble: 2 x 5
#  Z     W_mean W_median X_mean X_median
#  <fct>  <dbl>    <dbl>  <dbl>    <dbl>
#1 cat     5.25      5.5   3.75      3.5
#2 dog     5.67      5.5   6.67      7  

答案 1 :(得分:2)

您可以使用starts_with()来选择列,而不是按数字。

library(dplyr)
set.seed(1)
Data <- data.frame(
  W = sample(1:10),
  X = sample(1:10),
  Y = sample(c("yes", "no"), 10, replace = TRUE),
  Z = sample(c("cat", "dog"), 10, replace = TRUE)
)        

summarized <- 
  Data %>% 
  group_by(Z) %>% 
  summarise_if(is.numeric,funs(mean,median),na.rm=T) %>%
  select(Z, starts_with("W_"), starts_with("X_"))

summarized
#> # A tibble: 2 x 5
#>   Z     W_mean W_median X_mean X_median
#>   <fct>  <dbl>    <dbl>  <dbl>    <dbl>
#> 1 cat     5.25      5.5   3.75      3.5
#> 2 dog     5.67      5.5   6.67      7

reprex package(v0.3.0)于2019-12-09创建