Получение двух разных средств в R с использованием одинаковых чисел - PullRequest
2 голосов
/ 06 февраля 2020

Я пытаюсь вычислить среднее значение для некоторых сгруппированных данных, но сталкиваюсь с проблемой, когда среднее значение, генерируемое с помощью base::mean(), генерирует другое значение, чем когда я использую base:rowMeans() или пытаюсь повторить среднее в Excel.

Вот код с упрощенным фреймом данных, который просматривает только небольшой фрагмент данных:

df <- data.frame("ID" = 1101372,
                 "Q1" = 5.996667,
                 "Q2" = 6.005556,
                 "Q3" = 5.763333)

avg1 <- df %>%
  summarise(new_avg = mean(Q1,
                           Q2,
                           Q3)) # Returns a value of 5.99667

avg2 <- rowMeans(df[,2:4]) # Returns a value of 5.921852

Значение в avg2 - это то, что я получаю при использовании AVERAGE в Excel, но я не могу понять, почему mean() не генерирует то же число.

Есть мысли?

1 Ответ

1 голос
/ 06 февраля 2020

Здесь mean принимает только первый аргумент, т. Е. Q1, как 'x', потому что значение ?mean равно

означает (x, trim = 0, na.rm = ЛОЖЬ, ...)

т.е. второй и третий аргументы различны. В коде OP x будет приниматься как «Q1», trim как «Q2» и т. Д. ... в конце также означает, что пользователь может указать n количество параметров без каких-либо ошибок и приводит к путанице, подобной этой (если мы не проверяем использование)

Мы можем указать данные как ., задать интересующие столбцы и использовать их в rowMeans

df %>% 
    summarise(new_avg = rowMeans(.[-1]))

Это было бы более эффективно. Но, если мы хотим использовать mean как таковой, то выполните rowwise

df %>%
   rowwise() %>%
   summarise(new_avg = mean(c(Q1, Q2, Q3)))
# A tibble: 1 x 1
#  new_avg
#     <dbl>
#1    5.92

Или конвертируйте в «длинный» формат, а затем выполните group_by 'ID' и получите mean

library(dplyr)
library(tidyr)
df %>% 
     pivot_longer(cols = -ID) %>%
     group_by(ID) %>%  # can skip this step if there is only a single row
    summarise(new_avg = mean(value))
# A tibble: 1 x 2
#      ID new_avg
#    <dbl>   <dbl>
#1 1101372    5.92
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...