Вложение СУММЫ и СРЕДНЕГО в совокупность, чтобы получить средние баллы по группе

Я не могу найти набор данных, похожий на мою проблему, поэтому я изменил набор данных Iris (набор данных в R), чтобы он выглядел похожим — он достаточно близок!

data = iris
data$type = gl(5,30,150,labels=c("group1","group2","group3","group4","group5"))
data$ID = gl(30,5,150)

Затем я использовал следующий код

xtabs(Sepal.Length ~ Species + type, aggregate(Sepal.Length ~ Species + type + ID, data, mean))

что приводит к

type
Species      group1 group2 group3 group4 group5
  setosa      30.16  19.90   0.00   0.00   0.00
  versicolor   0.00  12.20  35.88  11.28   0.00
  virginica    0.00   0.00   0.00  26.24  39.64

Насколько я понимаю, мой код складывает вместе Sepal.Length для каждого идентификатора, а затем принимает среднее значение этих значений для каждого из видов и типов.

Это правильно?

Если нет, то как мне это получить?

Кроме того, как мне получить это, если мои данные таковы, что каждый идентификатор имеет несколько типов? (не могу понять, как построить это в R)

На самом деле, просто чтобы быть совершенно ясным

Что мне нужно, так это код, который суммирует Sepal.Length для каждого идентификатора И типа, затем он возьмет среднее значение этих сумм по всем идентификаторам и опубликует среднее значение Sepal.Length по типу и виду /


person k BORT    schedule 28.09.2016    source источник


Ответы (1)


С data.table:

library(data.table)
setDT(data)

#sum of Sepal.Length for each ID AND type
data[, id_type_sum := sum(Sepal.Length), by = .(ID, type)]

# mean of this variable by type and species
data[, mean(id_type_sum), by = .(type, Species)]

#   type    Species       V1
# 1: group1     setosa 25.13333
# 2: group2     setosa 24.87500
# 3: group2 versicolor 30.50000
# 4: group3 versicolor 29.90000
# 5: group4 versicolor 28.20000
# 6: group4  virginica 32.80000
# 7: group5  virginica 33.03333

И если вы хотите это в формате таблицы, вы можете использовать метод data.table dcast:

library(magrittr) # for the %>% operator
data[, mean(id_type_sum), by = .(type, Species)] %>%
  dcast(Species ~ type)

Результат:

      Species   group1 group2 group3 group4   group5
1:     setosa 25.13333 24.875     NA     NA       NA
2: versicolor       NA 30.500   29.9   28.2       NA
3:  virginica       NA     NA     NA   32.8 33.03333
person arvi1000    schedule 28.09.2016
comment
Я использовал этот код для своих реальных данных, и цифры выглядят так, как я и ожидал! Большое спасибо, это здорово - person k BORT; 29.09.2016