2016-10-05 5 views
0

У меня есть data.frame в R, который содержит возрасты, длины и общее количество лиц в каждой группе длины. Я хочу получить среднее и стандартное отклонение длин для каждой возрастной группы, и я чувствую, что делать это с dplyr будет проще всего. Тем не менее, я не могу понять, как это сделать: gather() этот конкретный набор данных. Вот данные:Использование сбора на уже собранном виде.frame в R

dat <- data.frame(age = sort(rep(1:5, 5)), 
       length = c(6:10, 8:12, 10:14, 12:16, 14:18), 
       total = sample(25:50, 50, replace=T)) 

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

age length total 
    1  6 38 
    1  7 42 
    1  8 49 
    1  9 28 
    1  10 26 
    2  8 37 

И я хочу, чтобы выглядеть следующим образом, так что я могу легко group_by(age) %>% summarize(mean = mean(length), sd = sd(length)).

age length 
1  6 
1  6 
1  6 
1  6 
1  6 

и т.д. (т.е. должно быть 38 6s для возраста 1, 42 7s для возраста 1 и так далее).

Как достичь этого, используя функцию gather() от tidyr? Кажется, я не могу это сделать. Рад услышать альтернативные предложения.

ответ

1

Как насчет вычисления взвешенного среднего?

dat <- data.frame(age = sort(rep(1:5, 5)), 
        length = c(6:10, 8:12, 10:14, 12:16, 14:18), 
        total = sample(25:50, 50, replace=T)) 
library(magrittr) 
library(dplyr) 

dat %>% 
    group_by(age) %>% 
    summarise(mean_length = sum(length * total)/sum(total), 
      wtd_mean = weighted.mean(length, total)) 

EDIT: это произошло со мной после публикации ранее, что R имеет weighted.mean функцию, которая делает это еще проще.

+0

Я сделал что-то вроде этого, но при вычислении стандартного отклонения он становится немного более волосатым. : | – PaulFrater

+0

См. '? Hmisc :: wtd.var'. 'Hmisc' также имеет' wtd.quantile', если вы находитесь в непараметрических мерах. – Benjamin

 Смежные вопросы

  • Нет связанных вопросов^_^