2016-09-06 3 views
-1

Мне нужно создать третий столбец в dataframe (называемый teste) ниже, который будет содержать среднее значение для модели транспортного средства, представленное таким образом, что на строке автомобиля он вычислил среднее значение для все модели автомобилей и аналогичные расчеты для велосипедов и грузовиков.Создание динамического вектора с контуром в R

model price 
car 10 
car 11 
car 12 
car 13 
car 14 
bike 5 
bike 6 
bike 7 
bike 8 
bike 9 
truck 12 
truck 13 
truck 14 
truck 15 
truck 16 

Я был в состоянии создать цикл, который может печатать желаемые результаты с помощью следующего кода R:

for(x in teste$model){ 
    print(mean(teste[teste$model==x, ]$price)) 
} 

Однако, при попытке создать третий столбец или вектор ниже код дает я ошибаюсь, заявляя, что строка замены больше данных.

 teste$media <- rep(NA, 15) 
    for(x in teste$model){ 
     teste$media[x] <- mean(teste[teste$model==x, ]$price) 
} 

Я понятия не имею, почему вектор замены больше. Может ли кто-нибудь помочь мне идентифицировать ошибку или предложить другой способ для достижения цели.

Спасибо всем заранее

Alex

ответ

2

Использование ave, который использует mean в качестве функции по умолчанию. См ?ave.

> teste$media <- ave(teste$price, teste$model) 
> teste 
    model price media 
1 car 10 12 
2 car 11 12 
3 car 12 12 
4 car 13 12 
5 car 14 12 
6 bike  5  7 
7 bike  6  7 
8 bike  7  7 
9 bike  8  7 
10 bike  9  7 
11 truck 12 14 
12 truck 13 14 
13 truck 14 14 
14 truck 15 14 
15 truck 16 14 
1

С dplyr:

library(dplyr) 

teste %>% group_by(model) %>% 
    mutate(media=mean(price)) 

Или с data.table:

library(data.table) 

setDT(teste)[ , media:=mean(price), by=model] 
+0

Спасибо за помощь, работала отлично. – alexdamado