Статистическая сводка группы данных по Cut - PullRequest
1 голос
/ 19 января 2020

У меня есть сотни данных, показывающих массу тела мелких животных разного возраста, полученные из многочисленных исследовательских работ. Я хочу сгруппировать и проанализировать вес по возрасту за периоды 7 дней. Я использовал cut in R успешно, чтобы сгруппировать данные по возрасту и иметь количество значений (количество) по умолчанию в каждом 7d бине. Но даже после большого количества поисков в Google я не могу найти способ расширить «сокращение», чтобы получить базовые статистические сводки для каждого возраста, включающие среднее значение, SE, CL и медиану. Возможно ли это, и может ли кто-нибудь помочь или направить меня в правильном направлении?

Я также посмотрел на dplyr и, хотя, похоже, у него есть возможность предоставлять статистические сводки, я не мог найти способ группировки возрастов. по 7d интервалам. Будет ли это лучшей альтернативой?

Спасибо за любую помощь от непрограммиста.

Дополнительная информация

Спасибо вам обоим за ваши комментарии. Я сожалею, что предоставил ограниченную информацию, я надеюсь, что это проясняет проблему. У меня есть более 2000 строк данных в Excel. Строки - это возраст в днях, столбцы - MaleFI, MaleMEI и MaleBW, где FI - потребление пищи, MEI - потребление метаболизируемой энергии, а BW - масса тела. Часть данных показана ниже. Обычно я могу анализировать данные с помощью сводной таблицы Excel, но она не включает опцию для вычисления медианы или стандартной ошибки; Power Pivot делает, но не группирует! Таким образом, данные являются следующими (отсортированы по возрасту в днях и без пробелов):

  • Возраст Мужской FI Мужской MEI Мужской BW
  • 28,00 14,62 212,66 121,68
  • 28,00 13,82 201.03 112.15
  • 28.00 13.82 201.03 112.15
  • 29.00 15.12 220.31 125.14 ...

Века непрерывны и могут go до 900, с различное количество значений для каждого возраста.

Цель состоит в том, чтобы сгруппировать по 7d периодам, и, как я упоминаю, провести статистический анализ по каждой группе таким образом:

  • Возраст MaleFI MaleMEI MaleBW
  • 21-28 Среднее среднее значение
  • SE SE SE
  • Среднее значение Медиана Среднее значение
  • 29-35 Среднее значение Среднее значение
  • SE SE SE
  • Медиана Медиана Медиана
  • 36-42 и т. Д. c.

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

library("xlsx")
library("dplyr")
Pivot.data <- read.xlsx(file.choose(), 1)  # read first sheet
pt<-cut(Pivot.data$Age, breaks=seq(21, 800, by=7))
table(pt)

Выход составляет (21,28] (28,35] (35,42] (42,49] (49,56] (56,63] (63,70] (70, 77]
6 15 41 73 92 98 95 99

Я был бы доволен форматом диапазонов, т.е. (21,28] и c, а не 21-28.

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

Дэн, вот вывод с использованием dput:

dput (head (Pivot.data, 20)) структура (список (Age = c (28, 28, 28, 28, 28, 28, 30, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35), MaleFI = c (14,62, 13,82, 10,6691449814126, 15,9859154929577, 11,7, 14,0273778252258, 13,5877862595419, 17,73, 17,93, 17,99, 22,12142857.7286, 17,6, 19,1, 21,6,6,6,6, 17,6, 21,6, 21,6, 21,6, 17,6, 17,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 21,6, 21,6, 21,6, 17,6, 17,6, 17,6, 17,6, 17,6, 21,6, 17, 21, 21, 21 , 21.4, 21.25, 20.37, +19,3215613382899, 23,169014084507), MaleMEI = c (212,66252, 201,02572, +144,342862453531, +216,273450704225, +160,171462269, +204,047711328562, 197,653240885495, 257,90058, 241,76812, 261,68254, 298,285342857143, 238,3216, 304,40168, 315,6482, 285,1016, 311,2844, 309,1025, 296,30202, 261,401403345724, 313,453591549295), MaleBW = c (121,68, 112,15, 85,7142857142856, 143,181818181818,9,12, 129, 222, 221, 225, 221, 225, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 2, 2, 2, 2, 31, 2, 5, 31, 12, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3 - 5, т. , 132,4, 191,21, 179,44, 138,095238095238, 202,272727272727)), row.names = c (NA, 20L), class = "data.frame")

1 Ответ

1 голос
/ 20 января 2020

Если я правильно понимаю (но, пожалуйста, попробуйте включить воспроизводимый пример в следующий раз), этот код должен выполнить:

library(tidyverse)
your_df %>% 
  # mutate(Age_cl = cut(Age, c(-Inf,30,60,Inf))) %>% 
  mutate(Age_cl = cut(Age, breaks=c(-Inf, seq(min(Age), max(Age), by=7), Inf), right = F)) %>%
  group_by(Age_cl) %>% 
  summarise(
    n=n(),
    m=mean(Age, na.rm=T),
    sd=sd(Age, na.rm=T),
    max=max(Age, na.rm=T),
    min=min(Age, na.rm=T)
  )

Вы создаете новый столбец age_cl, который является результатом cut, затем вы группируете по этому новому столбцу и summarise (или вы можете mutate снова, как хотите) все нужные вам сводки.

Вы также можете использовать summarise_at со списком функций :

your_df %>% 
  mutate(Age_cl = cut(Age, c(-Inf,30,60,Inf))) %>% 
  group_by(Age_cl) %>% 
  summarise_at("Age", list(m=mean, sd=sd, max=max, min=min), na.rm=T)

Обратите внимание, что другие аргументы будут применяться ко всем функциям, например na.rm здесь.

РЕДАКТИРОВАТЬ: Для записей, кажется, что есть способ использования функции summary, но вы должны преобразовать его результаты в data.frame, чтобы он работал. Это может не стоить summary по сравнению с написанием ваших функций, как описано выше. Вот пример с набором данных iris:

iris %>% 
  mutate(Sepal.Length_cl = cut(Sepal.Length, c(-Inf,5,6,Inf))) %>% 
  group_by(Sepal.Length_cl) %>% 
  group_modify(~summary(.$Sepal.Length) %>% unclass %>% t %>% as.data.frame)
...