Расчет среднего признака каждого уникального животного в наборе данных с использованием R - PullRequest
0 голосов
/ 10 марта 2011

У меня есть набор данных, который мне нужен, чтобы рассчитать среднее значение для каждой уникальной плотины, и это пример набора данных:

pig <- c(20111,20112,20113,20571,20572,20573,20584,20585,20586)
sex <- c(1,1,2,2,2,2,2,1,2)
wt <- c(1.54,0.84,0.83,1.14,1.42,1.07,1.25,1.05,1.42)
dam <- c(1661,1661,1661,1027,1027,1027,10331,10331,10331)
res <-c(1,1,1,1,1,NA,1,2,1)
mt <- c(2,2,2,1,1,NA,1,1,1)
ms <- c(1,1,1,1,1,NA,1,1,1)
cr <- c(26,24,21,23,25,24,22,22,22)
rt <- c(38.7,37.2,37.8,38.1,38.4,NA,38.1,38,38.3)
data <- data.frame(pig,sex,wt,dam,res,mt,ms,cr,rt)
data

Я хотел бы иметь что-то вроде этого:

udam <- c(1661,1027,10331)
tpig <- c(3,3,3)
asex <- c(1.3,2,1.7)
awt <- c(1.07,1.21,1.24)
ares <- c(1,1,1.33)
amt <- c(2,1,1)
ams <- c(1,1,1)
acr <- c(23.7,24,22)
art <- c(37.6,38.25,38.1)
data2 <- data.frame(udam,tpig,asex,awt,ares,amt,ams,acr,art)

Я надеюсь, что мой вопрос достаточно ясен, и любая помощь будет оценена!

Poasa

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Пакет plyr имеет очень полезные функции для этого. Например, мы можем использовать ddply, чтобы разделить фрейм данных по фактору, применить функцию и вернуть результаты снова в фрейм данных:

    library('plyr')

    ddply(data,.(dam),mean,na.rm=T)

    pig      sex   wt   dam      res mt ms       cr       rt
1 20572 2.000000 1.21  1027 1.000000  1  1 24.00000 38.25000
2 20112 1.333333 1.07  1661 1.000000  2  1 23.66667 37.90000
3 20585 1.666667 1.24 10331 1.333333  1  1 22.00000 38.13333

Или используйте функцию summarize для большего контроля:

ddply(data,.(dam),summarize,
  tpig = 3,
  asex = mean(sex,na.rm=T),
  sexRatio = sum(sex==1)/sum(sex==2),
  awt = mean(wt,na.rm=T),
  ares = mean(res,na.rm=T),
  amt = mean(mt,na.rm=T),
  ams = mean(ms,na.rm=T),
  acr = mean(cr,na.rm=T),
  art = mean(rt,na.rm=T),
  count = length(pig))
    dam tpig     asex sexRatio  awt     ares amt ams      acr      art count
1  1027    3 2.000000      0.0 1.21 1.000000   1   1 24.00000 38.25000     3
2  1661    3 1.333333      2.0 1.07 1.000000   2   1 23.66667 37.90000     3
3 10331    3 1.666667      0.5 1.24 1.333333   1   1 22.00000 38.13333     3
1 голос
/ 10 марта 2011

Это:

aggregate(cbind(sex, wt, res, mt, ms, cr, rt) ~ dam, data=data, FUN=mean,
  na.rm=TRUE, na.action=na.pass)

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

aggregate(pig ~ dam, data=data, FUN=length)
...