Суммируйте переменные рядом

Ищу решение своей проблемы. Я просто могу решить это перестановкой вручную.

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)

введите здесь описание изображения

Я хочу, чтобы результат выглядел так, как показано ниже, где каждая функция применяется к первому столбцу, а затем и каждая функция применяется ко второму столбцу и так далее. Мой код делает наоборот.

Конечно, я мог бы переставить столбцы, но Data Science не в этом. У меня сотни столбцов, и я хочу применить несколько функций.

Вот чего я хочу:

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

введите здесь описание изображения

Есть ли аргумент, который мне не хватает? Бьюсь об заклад, есть простое решение или другая функция выполняет свою работу. Ребята, заранее спасибо!


person crm_analytics    schedule 09.12.2019    source источник


Ответы (2)


Один из вариантов - постобработка с адекватным 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  

Если есть сотни столбцов, один из подходов состоит в том, чтобы получить подстроку имен столбцов и упорядочить

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  
person akrun    schedule 09.12.2019
comment
Спасибо за быстрый ответ. Ваши решения могут работать здесь, но не для сотен столбцов. Какой может быть другой подход? - person crm_analytics; 09.12.2019
comment
То же самое для @Daniel Sjoberg - person crm_analytics; 09.12.2019
comment
это отлично работает! Если вам не нужно сохранять исходный порядок входных данных (как в моем случае), это неплохо справляется со своей задачей. Спасибо, Арун! - person crm_analytics; 09.12.2019

Вы можете использовать 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

Создано 9 декабря 2019 г. пакетом REPEX (v0.3.0)

person Daniel D. Sjoberg    schedule 09.12.2019