2013-12-17 5 views
0

x - числовой вектор, а y - вектор символов, одинаковой длины. Мне нужно получить общую сумму x для каждого символа в y. Так, например, если y имеет буквы алфавита, алгоритм должен суммировать все значения x, индексированные «A», а затем все значения, индексированные «B» и т. Д. Кажется, это можно сделать с помощью совокупная функция, но я не смог понять, как это сделать.Общая сумма числового вектора, зависящего от значений от символьного вектора

+0

пожалуйста сделать воспроизводимый пример, поэтому мы не должны Faff вокруг создание фиктивных кадров данных. – Spacedman

+0

'aggregate (x, factor (y), sum)' не работает? – Usobi

ответ

2

Тестовые данные, в dataframe для удобства, а не двух векторов:

> d = data.frame(x=runif(10),y=sample(LETTERS[1:3],10,TRUE)) 
> d 
      x y 
1 0.25927547 B 
2 0.95012667 C 
3 0.85133149 C 
4 0.64658480 B 
etc 

Используйте tapply:

> tapply(d$x,d$y,sum) 
     A  B  C 
1.547225 1.891884 2.666552 

Убедите себя:

> sum(d$x[d$y=="A"]) 
[1] 1.547225 
> sum(d$x[d$y=="B"]) 
[1] 1.891884 
> sum(d$x[d$y=="C"]) 
[1] 2.666552 

aggregate функция с формулой аргумент упрощает работу с несколькими столбцами :

> d=data.frame(x=runif(10),y=sample(LETTERS[1:3],10,TRUE),z=sample(LETTERS[1:3],10,TRUE)) 
> d 
      x y z 
1 0.4166217 A C 
2 0.5816940 B C 
3 0.9915231 A C 
4 0.7177323 B C 
etc 

Мы хотим суммировать x в классах, определяемых y и z.

> aggregate(x~y+z,d,sum) 
    y z   x 
1 C A 1.6392171 
2 B B 0.9389463 
3 C B 0.3330299 
4 A C 2.3748477 
5 B C 1.2994263 

Убедите себя:

> sum(d$x[d$y=="C" & d$z=="A"]) 
[1] 1.639217 
> sum(d$x[d$y=="B" & d$z=="B"]) 
[1] 0.9389463 

Обратите внимание, что C, A представляет собой отдельный вход A, C ...

+0

два больших пальца вверх для вашего метода! очень эффективный и элегантный. – user3083324

+0

Это работает с двойной индексацией? скажем, кадр данных с x, y и z? – user3083324

+0

Прочтите помощь для tapply и посмотрите, можете ли вы это понять. – Spacedman

Смежные вопросы