2015-07-20 1 views
0

У меня возникли проблемы с выяснением того, как я могу вычислить простое среднее с dplyr по данным Long Format.dplyr средняя группа по длинным форматам данных

Мои данные выглядят следующим образом:

hldid idno sex diary age 
1 1294 1294_1 2  1 39 
2 1294 1294_1 2  2 39 
3 1294 1294_2 1  1 43 
4 1294 1294_2 1  2 43 
... 

С 4 переменные: hldid idno sex diary age idno одно и личный идентификатор но не уникальный ключ.

Каждый человек повторяется раз, по одному на каждые diary заполнено.

Я хотел бы просто вычислить age среднее значение sex.

Не могли бы вы мне помочь?

Я пытался что-то вроде:

dta %>% 
    group_by(sex) %>% 
    mutate(ng = n_distinct(idno)) %>% 
    group_by(age, add=TRUE) %>% 
    summarise(mean = n()/ng[1]) 

Но это не работает.

Данные:

dta = structure(list(hldid = c(1294, 1294, 1294, 1294, 1352, 1352, 
1352, 1352, 3741, 3741, 3741, 3741, 3809, 3809, 3809, 3809, 4037, 
4037, 4037, 4037), idno = c("1294_1", "1294_1", "1294_2", "1294_2", 
"1352_1", "1352_1", "1352_2", "1352_2", "3741_1", "3741_1", "3741_2", 
"3741_2", "3809_1", "3809_1", "3809_2", "3809_2", "4037_1", "4037_1", 
"4037_2", "4037_2"), sex = c(2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L), diary = c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L), age = c(39L, 39L, 43L, 43L, 31L, 31L, 37L, 37L, 
33L, 33L, 37L, 37L, 34L, 34L, 37L, 37L, 41L, 41L, 32L, 32L)), .Names = c("hldid", 
"idno", "sex", "diary", "age"), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -20L), vars = list(hldid), drop = TRUE, indices = list(
0:3, 4:7, 8:11, 12:15, 16:19), group_sizes = c(4L, 4L, 4L, 
4L, 4L), biggest_group_size = 4L, labels = structure(list(hldid = c(1294, 
1352, 3741, 3809, 4037)), class = "data.frame", row.names = c(NA, 
-5L), .Names = "hldid", vars = list(hldid))) 

быстрое обновление

Может быть, это не относится к этому примеру, но такого рода проблем, которые я имею в виду следующее:

Представьте у нас есть следующие данные: 3 женщины и 2 мужчины, а также манекен act переменная.

Если мы это сделаем и не будем учитывать формат длинного формата mean, у нас будут проблемы.

aggregate(act ~ sex, FUN = mean, data = dtaTime) 

Что мы должны сделать это:

aggregate(act ~ sex, FUN = sum, data = dtaTime) 
6/2 # men 
10/3 # women 

данных

dtaTime = structure(list(id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L), 
sex = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), act = c(1L, 
1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 
1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L)), .Names = c("id", "sex", 
"act"), class = "data.frame", row.names = c(NA, -25L)) 
+0

Данные в конце не может быть прочитан, потому что она имеет некоторые 'ВАР = список (hldid)' вещь в нем и у нас нет 'hldid' – Frank

+3

Вы делаете это слишком сложно,' dta%>% group_by (sex)%>% summary (meanage = mean (age)) 'должен дать вам средний возраст по полу. – Jaap

+0

Я знаю, что это дает правильные результаты, я задавался вопросом, потому что мы не указываем идентификаторы 'n_distinct', если это может вызвать проблемы. Потому что это происходит, когда вы вычисляете среднее значение для данных в формате long. – giacomo

ответ

6

Вы делаете это слишком сложно,

dta %>% 
    group_by(sex) %>% 
    summarise(meanage = mean(age)) 

должно дать вам средний возраст по секс.

Основание R альтернатива:

aggregate(age ~ sex, dta, mean) 

data.table альтернатива:

library(data.table) 
setDT(dta)[, .(meanage = mean(age)), by = sex] 
+0

Я сделал быстрое обновление объясняя, что я имею в виду. Но, возможно, это не относится к вопросу, который я задал, и если бы мне не было интересно узнать, почему в одном случае это просто, а в другом - нет. Спасибо, парни. – giacomo