我有一个看起来像这样的数据集,有很多类,每个类都有很多(5-10)个子类,每个子类都有一个与之关联的值:
> data.frame(class=rep(letters[1:4], each=4), subclass=c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8), value=1:16)
class subclass value
1 a 1 1
2 a 1 2
3 a 2 3
4 a 2 4
5 b 3 5
6 b 3 6
7 b 4 7
8 b 4 8
9 c 5 9
10 c 5 10
11 c 6 11
12 c 6 12
13 d 7 13
14 d 7 14
15 d 8 15
16 d 8 16
我想首先对每个类/子类的值求和,然后在所有子类中取每个类的中值。
即,中间步骤将对每个类的每个子类的值求和,看起来像这样(请注意,我不需要保留此中间步骤的数据):
> data.frame(class=rep(letters[1:4], each=2), subclass=1:8, sum=c(3,7,11,15,19,23,27,31))
class subclass sum
1 a 1 3
2 a 2 7
3 b 3 11
4 b 4 15
5 c 5 19
6 c 6 23
7 d 7 27
8 d 8 31
第二步将获取所有子类中每个类的中位数,如下所示:
> data.frame(class=letters[1:4], median=c(median(c(3,7)), median(c(11,15)), median(c(19,23)), median(c(27,31))))
class median
1 a 5
2 b 13
3 c 21
4 d 29
这是我需要保留的唯一数据。请注意,$class 和 $subclass 都将是因子变量,并且 value 将始终是一个非缺失的正整数。每个类都有不同数量的子类。
我确信我可以用一些讨厌的 for 循环来做到这一点,但我希望有一种更好的方法,它可以矢量化并且更容易维护。