x是数字向量,y是字符向量,两者长度相同。 我必须得到y中每个字符的x的总和。 因此,例如,如果y具有字母表中的字母,则算法必须将由“A”索引的x的所有值和由“B”等索引的所有值相加。似乎可以使用聚合函数,但我无法弄清楚如何。
答案 0 :(得分:2)
为方便起见,在数据框中测试数据而不是两个向量:
> 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
我们想在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 ...
的单独条目