Скрипт R — Получение средних значений

У меня есть два списка. Первый список имеет конечное число вариантов:

a = [1, 1.5, 2, 2.5, 2, 2.5, 1, 1.5, 1, 2.5]

а затем у меня есть еще один список с целыми числами

b = [34, 67, 45, 12, 45, 78, 90, 50, 60, 12]

Как видите, в списке А возможны только 1, 1,5, 2 и 2,5. Также обратите внимание, что два списка соответствуют друг другу. Таким образом, для первых элементов 1 имеет значение 34.

Я хочу усреднить каждое из 1, 1,5, 2 и 2,5, в зависимости от значений, которые он имеет (которые указаны в b).

Так, например, 2 имеет 45 на позиции 3 и 45 на позиции 5. Следовательно, среднее значение равно 45.

Как я могу сделать такие вещи красиво в R?


person CodeGuy    schedule 17.09.2011    source источник


Ответы (2)


Я предполагаю, что a и b на самом деле являются числовыми векторами, а не списками - если нет, unlist их сделать так.

a <- c(1, 1.5, 2, 2.5, 2, 2.5, 1, 1.5, 1, 2.5)
b <- c(34, 67, 45, 12, 45, 78, 90, 50, 60, 12)
tapply(b,a,mean)

результат:

       1      1.5        2      2.5 
61.33333 58.50000 45.00000 34.00000 
person Ben Bolker    schedule 17.09.2011
comment
ах, извини, Бен, не видел твоего ответа до того, как опубликовал свой. Кстати, вам не нужно использовать list - person Ramnath; 17.09.2011
comment
идеально. я удалю свой ответ, чтобы избежать дублирования :) - person Ramnath; 17.09.2011

Еще два варианта, один из базы R и другой в plyr:

> aggregate(b, list(a), mean)
  Group.1        x
1     1.0 61.33333
2     1.5 58.50000
3     2.0 45.00000
4     2.5 34.00000
> library(plyr)
> ddply(data.frame(a,b), "a", summarize, meanval = mean(b))
    a  meanval
1 1.0 61.33333
2 1.5 58.50000
3 2.0 45.00000
4 2.5 34.00000
person Chase    schedule 17.09.2011