Вычисление средних сгруппированных столбцов в г - PullRequest
0 голосов
/ 20 марта 2020

У меня есть фрейм данных с более чем 190 000 строк, что-то вроде этого:

 library(tibble)
 mydf <- tribble(~col1, ~col2, ~col3, ~col4, ~col5,
            "A", 16, 45, 53, 35, 
            "A", 17,  12, 54, 12,
            "A", 19, 12, 54, 35,
            "B", 10, 87, 55, 22,
            "B", 10, 87, 55, 22,
            "B", 12, 23, 12, 67)

Есть повторяющиеся итерации col1; некоторые имеют одинаковые значения по столбцам, другие имеют разные значения по столбцам, как показано в примере кадра данных.

Для каждого повторного уровня в col1 я хочу объединить эти значения в одну строку, показывающую среднее из всех рядов. Я до сих пор пользуюсь этим ответом , однако, это оставляет меня со всеми различными строками:

 mydf %>% group_by(col1) %>% 
   mutate_each(funs(mean), -(1)) %>% 
   distinct()

 # A tibble: 5 x 5
 # Groups:   col1 [2]
   col1   col2  col3  col4  col5
   <chr> <dbl> <dbl> <dbl> <dbl>
 1 A        16  23    53.7  27.3
 2 A        17  23    53.7  27.3
 3 A        19  23    53.7  27.3
 4 B        10  65.7  40.7  37  
 5 B        12  65.7  40.7  37  

Что мне действительно нужно, так это одна строка для A, B , et c, показывая средние значения.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вам необходимо использовать summarize вместо mutate, чтобы суммировать сгруппированные значения. В этом случае я использую summarize_all для суммирования всех не сгруппированных значений.

library(tidyverse)

mydf <- tribble(~col1, ~col2, ~col3, ~col4, ~col5,
                "A", 16, 45, 53, 35, 
                "A", 17,  12, 54, 12,
                "A", 19, 12, 54, 35,
                "B", 10, 87, 55, 22,
                "B", 10, 87, 55, 22,
                "B", 12, 23, 12, 67)

mydf %>% 
  group_by(col1) %>% 
  summarize_all(.funs = list(mean))

# A tibble: 2 x 5
  col1   col2  col3  col4  col5
  <chr> <dbl> <dbl> <dbl> <dbl>
1 A      17.3  23    53.7  27.3
2 B      10.7  65.7  40.7  37  
0 голосов
/ 20 марта 2020

Если в столбцах со 2 по 5 все наблюдения одного и того же измерения, имеет смысл использовать tidyr::pivot_longer(). Затем возьмите группу по col1 и новые группы со 2 по 5. Наконец, чтобы получить нужную форму, используйте tidyr::pivot_wider()

library(tidyverse)

mydf <- tribble(~col1, ~col2, ~col3, ~col4, ~col5,
                "A", 16, 45, 53, 35,
                "A", 17,  12, 54, 12,
                "A", 19, 12, 54, 35,
                "B", 10, 87, 55, 22,
                "B", 10, 87, 55, 22,
                "B", 12, 23, 12, 67)

mydf %>%
  pivot_longer(cols = -col1) %>%
  group_by(col1, name) %>%
  summarise(mean = mean(value)) %>%
  pivot_wider(names_from = name, values_from = mean)
#> # A tibble: 2 x 5
#> # Groups:   col1 [2]
#>   col1   col2  col3  col4  col5
#>   <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 A      17.3  23    53.7  27.3
#> 2 B      10.7  65.7  40.7  37

Создано в 2020-03-20 с помощью пакета Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...