2016-02-17 2 views
0

Я пытаюсь сделать две подвектора равной длиной от двух векторов равной длины.R: Среднее число подвекторов на основе повторов в другом векторе

Значения в первом векторе упорядочены следующим образом:

a<-c(9,9,9,8,8,7,6,5,5,5) 

Второй вектор является случайным, но позволяет принимать

b<-c(1,2,3,4,5,6,7,8,9,10) 

Первый подвектор прост: это просто вектор a withouth повторяет

f(a)<-c(9,8,7,6,5) 

Второй подвектор должен быть выполнен следующим образом s: для одного значения в векторе a (нет повторов в a) Вектор g(b) имеет то же значение, что и вектор b в соответствующем положении. Для повторов в a значение g(b) должно быть средним значений из соответствующего подвектора b. Итак:

g(b)<-c(mean(c(1,2,3)), mean(c(4,5)), 6, 7, mean(c(8,9,10))) 

Я понятия не имею, с чего начать. Thx за помощью!

+1

Возможный дубликат [Как использовать функцию агрегирования в R] (http: // stackoverflow.com/questions/20620764/how-to-use-aggregate-function-in-r) – Laterow

ответ

1

tapply - это функция, которую вы хотите. См. ?tapply, чтобы узнать, как это работает. Здесь:

res<-tapply(b,a,mean) 
# 5 6 7 8 9 
#9.0 7.0 6.0 4.5 2.0 

Если вы хотите сохранить порядок:

tapply(b,a,mean)[as.character(unique(a))] 
# 9 8 7 6 5 
#2.0 4.5 6.0 7.0 9.0 

Как вы можете видеть, это дает unique значения a и для каждого из них, нужная функция (в данном случае mean(b)) оценивается.

+0

проблема заключается в том, что tapply меняет исходный порядок ключей (сортирует их по возрастанию) – digEmAll

+0

@digEmAll Почему это проблема? – nicola

+0

Простые решения проще всего пропустить. Спасибо! – Bobesh

1

Вы можете сделать таким образом:

uniqueA <- a[!duplicated(a)] # or simply unique(a) but I'm not sure about order preservation 
uniqueB <- as.numeric(by(b,match(a,uniqueA),mean)) 

> uniqueA 
[1] 9 8 7 6 5 
> uniqueB 
[1] 2.0 4.5 6.0 7.0 9.0 
+1

'unique' сохраняет заказ. См. '? Unique' и проверьте аргумент' fromLast'. Попробуйте, например, различие между уникальными (c (1,3,1)) и уникальными (c (1,3,1), fromLast = TRUE). – nicola

+0

@nicola: Спасибо, я быстро просмотрел документацию, но я пропустил это;) – digEmAll

1

Мы можем также использовать ave

unique(ave(b, a)) 
#[1] 2.0 4.5 6.0 7.0 9.0 

Или другой вариант был бы преобразовать 'B' в factor с levels указано

tapply(b, factor(a, levels=unique(a)), FUN=mean) 
# 9 8 7 6 5 
#2.0 4.5 6.0 7.0 9.0