Цикл для вычисления среднего значения подмножества фрейма данных в r

У меня есть следующие data.frame:

> test
  a b  c
1 1 4 10
2 1 5 11
3 2 6 12
4 2 7 14
5 2 8 15
6 8 9 15

Я хотел бы написать цикл for, который будет вычислять среднее значение вектора b для каждого значения в векторе a. Поэтому я хотел бы следующий вывод:

> average
    1   2   8
[1] 4.5 7.0 9.0

Моя попытка до сих пор

subset<-data.frame()
average<-vector(mode="numeric")
for (i in 1:length(test$a)) {
  subset<-subset(test,test$a==test$a[i])
  average[i]<-mean(subset$b)
}

Тем не менее, я получаю следующий результат

> average
[1] 4.5 4.5 7.0 7.0 7.0 9.0

Это должно быть довольно легко, но я, к сожалению, не справляюсь.

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

Заранее большое спасибо.

2 ответа

Решение

Одна строка в базе R...

tapply(test$b,test$a,mean)

  1   2   8 
4.5 7.0 9.0

Кстати, ваш код не работает, потому что вы перебираете каждый элемент test$a, даже дублированные значения, а не только над элементами unique(test$a),

Вы можете попробовать это с data.table

library(data.table)
setDT(test)
test[, mean (b), by = a]
a  V1
1: 1 4.5
2: 2 7.0
3: 8 9.0
Другие вопросы по тегам