聚合符合两个条件的列

时间:2015-02-05 15:04:55

标签: r

我使用了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)它将总结年份

1 个答案:

答案 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的数据框数据中的新变量,它只是对不同年龄段的所有死亡人数进行求和