我使用了aggregate()函数,但始终使用FUN=mean
而不是sum
。似乎有一些特质使得事情变得困难。
我正在使用世界卫生组织的死亡率数据集,其格式如下:
> head(data)
Country Admin1 SubDiv Year List Cause Sex Frmat IM_Frmat Deaths1 Deaths2 Deaths3 Deaths4 Deaths5 Deaths6 Deaths7 Deaths8 Deaths9 Deaths10 Deaths11 Deaths12 Deaths13 Deaths14 Deaths15 Deaths16 Deaths17
1 1125 NA 2000 103 V72 1 2 8 1 0 0 NA NA NA 0 0 0 0 0 0 1 0 0 0 0
2 1125 NA 2000 103 V77 1 2 8 1 0 0 NA NA NA 0 0 0 0 0 1 0 0 0 0 0
3 1125 NA 2000 103 V78 1 2 8 19 1 0 NA NA NA 0 2 2 0 2 2 1 3 1 1 2
4 1125 NA 2000 103 V58 1 2 8 30 0 1 NA NA NA 1 2 2 1 4 3 2 4 5 1 0
5 1125 NA 2000 103 V58 2 2 8 4 0 0 NA NA NA 1 0 0 0 0 2 1 0 0 0 0
6 1125 NA 2000 103 V74 1 2 8 5 0 0 NA NA NA 1 1 0 0 1 0 1 0 1 0 0
Deaths18 Deaths19 Deaths20 Deaths21 Deaths22 Deaths23 Deaths24 Deaths25 Deaths26 IM_Deaths1 IM_Deaths2 IM_Deaths3 IM_Deaths4 Name
1 0 0 0 0 0 0 NA NA 0 0 NA NA NA Egypt
2 0 0 0 0 0 0 NA NA 0 0 NA NA NA Egypt
3 0 1 0 0 0 1 NA NA 0 1 NA NA NA Egypt
4 2 1 1 0 0 0 NA NA 0 0 NA NA NA Egypt
5 0 0 0 0 0 0 NA NA 0 0 NA NA NA Egypt
6 0 0 0 0 0 0 NA NA 0 0 NA NA NA Egypt
这显示了男性(性别= 1)和女性(性别= 2)的1个国家(1125 ==埃及)1年内多种疾病(V72,V77等)的原因。死亡列数是每个年龄组的死亡人数。
问题是,我想根据每个国家/地区,每个性别对一些疾病代码的死亡人数进行分组。具体来说,我想要疾病代码I20 * - I25 *。这些对应于缺血性心脏病死亡。
我做的第一件事就是只选择那些行:
codes = c("1067","I20","I21","I22","I23","I24","I25",paste("I",200:250,sep="")) #ICD-10 codes for IHD
data_ihd <- subset(data, Cause %in% codes)
然后我尝试使用aggregate
对与Country,Year,Sex匹配的行求和。 我不再关心疾病代码 - 这个数据集每个国家/年/性别组合每个疾病代码有1行 - 我想把所有的疾病都当作1并将死亡人数加起来。
好像我应该能够做到:
> aggregate(data_ihd, by=list(data_ihd$Name,data_ihd$Year,data_ihd$Sex),FUN=sum)
Error in Summary.factor(3518L, na.rm = FALSE) :
‘sum’ not meaningful for factors
但似乎没有。这很奇怪,因为如果我使用FUN=mean
,我会很高兴。
我知道这是因为我有因素,但我不知道如果不主动删除这些列,我怎么会失去因素呢?
你会建议什么?
我很高兴使用像dplyr或tidyr这样的软件包,但不确定它们会如何帮助...
编辑:我想我也需要在这里小心,我只将死亡*列加上而不是Country,Year列!我不确定聚合是否确保它不会对您在by=
中提供的列进行求和
编辑:我被要求提供更多关于我想要的信息。如果我们采用以下数据集:
> head(data)
Country Admin1 SubDiv Year List Cause Sex Frmat IM_Frmat Deaths1 Deaths2 Deaths3 Deaths4 Deaths5 Deaths6 Deaths7 Deaths8 Deaths9 Deaths10 Deaths11 Deaths12 Deaths13 Deaths14 Deaths15 Deaths16 Deaths17
1 1000 NA 2000 103 1 1 2 8 1 0 0 NA NA NA 0 0 0 0 0 0 1 0 0 0 0
2 1000 NA 2000 103 1 2 2 8 1 0 0 NA NA NA 0 0 0 0 0 1 0 0 0 0 0
3 1000 NA 2000 103 2 1 2 8 19 1 0 NA NA NA 0 2 2 0 2 2 1 3 1 1 2
4 1000 NA 2000 103 2 2 2 8 30 0 1 NA NA NA 1 2 2 1 4 3 2 4 5 1 0
5 1000 NA 2001 103 1 1 2 8 4 0 0 NA NA NA 1 0 0 0 0 2 1 0 0 0 0
6 1000 NA 2001 103 1 2 2 8 5 0 0 NA NA NA 1 1 0 0 1 0 1 0 1 0 0
7 1000 NA 2001 103 2 1 2 8 4 0 0 NA NA NA 1 0 0 0 0 2 1 0 0 0 0
8 1000 NA 2001 103 2 2 2 8 5 0 0 NA NA NA 1 1 0 0 1 0 1 0 1 0 0
9 2000 NA 2000 103 1 1 2 8 4 0 0 NA NA NA 1 0 0 0 0 2 1 0 0 0 0
10 2000 NA 2000 103 1 2 2 8 5 0 0 NA NA NA 1 1 0 0 1 0 1 0 1 0 0
成为
Country Admin1 SubDiv Year List Sex Frmat IM_Frmat Deaths1 Deaths2 Deaths3 Deaths4 Deaths5 Deaths6 Deaths7 Deaths8 Deaths9 Deaths10 Deaths11 Deaths12 Deaths13 Deaths14 Deaths15 Deaths16 Deaths17
1 1000 NA 2000 103 1 2 8 20 1 0 NA NA NA 0 2 2 0 2 2 3 3 1 1 2
2 1000 NA 2000 103 2 2 8 31 0 1 NA NA NA 1 2 2 1 4 4 2 4 5 1 0
...
. 2000 NA 2000 ...
正如您所看到的,第1行和第3行已经与Deaths列相加,因为Country,Year和Sex相等。原因被忽略了。当然,匹配列尚未汇总。
编辑3:让我们简单化一下,然后:
Country Year Sex Cause Deaths1 Deaths2 Deaths3
1 UK 2000 1 A 1 1 1
2 UK 2000 2 A 1 1 1
3 UK 2000 1 B 1 1 1
4 UK 2000 2 B 1 1 1
5 UK 2001 1 A 1 1 1
6 UK 2001 2 A 1 1 1
7 UK 2001 1 B 1 1 1
8 UK 2001 2 B 1 1 1
1 USA 2000 1 A 1 1 1
2 USA 2000 2 A 1 1 1
3 USA 2000 1 B 1 1 1
4 USA 2000 2 B 1 1 1
5 USA 2001 1 A 1 1 1
6 USA 2001 2 A 1 1 1
7 USA 2001 1 B 1 1 1
8 USA 2001 2 B 1 1 1
...
将所有原因归为一组(死亡人数总和),当县,年和性别相同时,成为:
Country Year Sex Deaths1 Deaths2 Deaths3
1 UK 2000 1 2 2 2
2 UK 2000 2 2 2 2
3 UK 2001 1 2 2 2
4 UK 2001 2 2 2 2
5 USA 2000 1 2 2 2
6 USA 2000 2 2 2 2
7 USA 2001 1 2 2 2
8 USA 2001 2 2 2 2
我似乎无法在这里使用聚合,因为1)国家是一个因素; 2)它将总结年份
答案 0 :(得分:1)
编辑:鉴于你上面所说的话,这应该会让你到那里:
好的,所以你想知道每个国家,每年和他们的性别有多少人死亡,无视死亡的原因:require(dplyr, magrittr)
group_by(data, Country, Year, Sex) %>% # here you specify which variable you wanna group by
summarise("deathsum.I20" = sum(I20), #now the sum gets calculated for each # level of the grouping variable
"deathsum.1" = sum(Deaths1),
"deathsum.2" = sum(Deaths2),
"deathsum.3" = sum(Deaths3),
"deathsum.4" = sum(Deaths4)))
同样的逻辑适用于其余的死亡类别,这忽略了原因,这就是你想要的,
如果您还想忽略年龄并且只是总结所有死亡组,您可以在运行上述其余代码之前执行此操作:
mutate(data, deathsum = rowsum(select(data, Deaths1:Deaths25))
这为您提供了一个名为deathsum的数据框数据中的新变量,它只是对不同年龄段的所有死亡人数进行求和