Использование R & dplyr для подведения итогов - group_by, count, mean, sd

Доброго времени суток и привет! Это мой первый пост о переполнении стека. Я новичок в R и даже в более новом dplyr. У меня есть небольшой набор данных, состоящий из двух столбцов - var1 и var2. Столбец var1 состоит из num значений. Столбец var2 состоит из факторов с 3 уровнями - A, B и C.

        var1 var2
1  1.4395244    A
2  1.7698225    A
3  3.5587083    A
4  2.0705084    A
5  2.1292877    A
6  3.7150650    B
7  2.4609162    B
8  0.7349388    B
9  1.3131471    B
10 1.5543380    B
11 3.2240818    C
12 2.3598138    C
13 2.4007715    C
14 2.1106827    C
15 1.4441589    C

'data.frame':   15 obs. of  2 variables:
 $ var1: num  1.44 1.77 3.56 2.07 2.13 ...
 $ var2: Factor w/ 3 levels "A","B","C": 1 1 1 1 1 2 2 2 2 2 ...

Я пытаюсь использовать dplyr для group_by var2 (A, B и C), затем подсчитывать и суммировать var1 с помощью среднего и sd. Подсчет работает, но вместо того, чтобы предоставлять среднее значение и стандартное отклонение для каждой группы, я получаю общее среднее значение и стандартное отклонение рядом с каждой группой.

Чтобы попытаться решить эту проблему, я провел несколько поисков в Интернете. Похоже, все результаты имеют синтаксис, аналогичный тому, который я использую. Я также прочитал все рекомендуемые сообщения, которые предлагал Stack Overflow перед публикацией. Кроме того, я попытался перезапустить R и убедился, что не использую plyr.

Вот код, который я использовал для создания набора данных и dplyr group_by / summarize.

library(dplyr)
set.seed(123)
var1 <- rnorm(15, mean=2, sd=1)
var2 <- c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B",
          "C", "C", "C", "C", "C")
df <- data.frame(var1, var2)
df

df %>%
  group_by(df$var2) %>%
  summarize(
    count = n(),
    mean = mean(df$var1, na.rm = TRUE),
    sd = sd(df$var1, na.rm = TRUE)
  )

Вот результаты:

# A tibble: 3 x 4
  `df$var2` count  mean    sd
  <fct>     <int> <dbl> <dbl>
1 A             5  2.15 0.845
2 B             5  2.15 0.845
3 C             5  2.15 0.845

Счетчик работает, показывая счет по 5 для каждой группы. Каждая группа показывает общее среднее значение и стандартное отклонение для всего столбца, а не для каждой группы. Ожидаемые результаты - это количество, среднее значение и стандартное отклонение для каждой группы.

Я уверен, что упускаю из виду кое-что очевидное, но буду очень признателен за любую помощь.

Спасибо!


person earlev4    schedule 25.07.2019    source источник
comment
не используйте $ при обращении к именам столбцов в dplyr, df %>% group_by(var2) %>% summarize( count = n(), mean = mean(var1, na.rm = TRUE), sd = sd(var1, na.rm = TRUE) )   -  person Ronak Shah    schedule 25.07.2019
comment
Вы хотите group_by(var2), mean(var1) и sd(var1), не mean(df$var1), sd(df$var1). Второй синтаксис дает значение для всего столбца, а не для сгруппированной переменной.   -  person neilfws    schedule 25.07.2019
comment
Огромное спасибо!!! Оба решения сработали как шарм. Очень благодарен за помощь. Я ценю это.   -  person earlev4    schedule 25.07.2019


Ответы (1)


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

library(dplyr)
set.seed(123)
var1 <- rnorm(15, mean=2, sd=1)
var2 <- c(rep("A", 5), rep("B", 5), rep("C", 5))
df <- data.frame(var1, var2) 
df_stat <- df %>% group_by(var2) %>% summarize(
                                      count = n(),
                                       mean = mean(var1, na.rm = TRUE), 
                                         sd = sd(var1, na.rm = TRUE)) 
head(df_stat)
# A tibble: 3 x 4
# var2   count  mean    sd
# <fct>  <int>  <dbl>  <dbl>
# 1 A      5    2.19   0.811
# 2 B      5    1.96   1.16 
# 3 C      5    2.31   0.639
person dbo    schedule 25.07.2019
comment
Большое спасибо, dbo !!! Я очень ценю официальный ответ. Очень красиво отформатирован и структурирован. - person earlev4; 25.07.2019
comment
рад помочь, @ earlev4. добро пожаловать в SO! - person dbo; 26.07.2019