以字符向量的值为条件的数值向量的总和

时间:2013-12-17 14:55:59

标签: r

x是数字向量,y是字符向量,两者长度相同。 我必须得到y中每个字符的x的总和。 因此,例如,如果y具有字母表中的字母,则算法必须将由“A”索引的x的所有值和由“B”等索引的所有值相加。似乎可以使用聚合函数,但我无法弄清楚如何。

1 个答案:

答案 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 ...

的单独条目