在不应用函数的情况下传播多个分组变量中的一个

时间:2015-08-21 07:55:10

标签: r reshape2 tidyr

无法获得tidyr,reshape或reshape2来做我认为简单的事情。

拥有如下所示的数据:

    agecat  year    Drug                    total
    <1      1999    Amikacin                12
    <1      1999    Cefepime                3
    <1      1999    Ceftazidime             13
    <1      2000    Amikacin                3
    <1      2000    Cefepime                6
    <1      2000    Ceftazidime             3
    <1      2000    Ciprofloxacin           4
    1-5     1999    Amikacin                37
    1-5     1999    Cefepime                25
    1-5     1999    Ceftazidime             38
    1-5     1999    Ciprofloxacin           38
    1-5     2000    Amikacin                52
    1-5     2000    Cefepime                34
    1-5     2000    Ceftazidime             45

..但更长的时间,有4个年龄段,14年(1999-2012)和10种药物,每种都有一个独特的总数。我希望传播'年'并维持总数,基本上要有一个广泛的'时间轴'的药物年龄趋势。即。

agecat      drug       1999   2000   
<1          Amikacin    23      3    
<1          Cefepime     3      6

当我只有两个分组变量时,我已经非常幸运地在tidyr中传播,但添加第三个似乎将它全部抛弃......我要么得到一个稀疏矩阵或一个名称匹配错误。使用melt / dcast,我尝试添加一个ID列(1:n行),但仍然没有...而且当我不想更改数据时,我无法理解要应用的函数,只需要它广泛。我错过了什么?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用spread的{​​{1}}来实现目标:

tidyr

答案 1 :(得分:0)

问题数据:

df <- structure(list(agecat = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("<1", "1-5"), class = "factor"), 
    year = c(1999L, 1999L, 1999L, 2000L, 2000L, 2000L, 2000L, 
    1999L, 1999L, 1999L, 1999L, 2000L, 2000L, 2000L), Drug = structure(c(1L, 
    2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L), .Label = c("Amikacin", 
    "Cefepime", "Ceftazidime", "Ciprofloxacin"), class = "factor"), 
    total = c(12L, 3L, 13L, 3L, 6L, 3L, 4L, 37L, 25L, 38L, 38L, 
    52L, 34L, 45L)), .Names = c("agecat", "year", "Drug", "total"
), class = "data.frame", row.names = c(NA, -14L))

reshape2::dcast提供了一种简单的方法,可以使数据集“更宽”,以便多年形成包含total值的列:

dcast(df, agecat + Drug ~ year, value.var = "total")

#   agecat          Drug 1999 2000
# 1     <1      Amikacin   12    3
# 2     <1      Cefepime    3    6
# 3     <1   Ceftazidime   13    3
# 4     <1 Ciprofloxacin   NA    4
# 5    1-5      Amikacin   37   52
# 6    1-5      Cefepime   25   34
# 7    1-5   Ceftazidime   38   45
# 8    1-5 Ciprofloxacin   38   NA

但是,根据评论,实际数据集略有不同。对于给定年份中的agecatdrug,它似乎有多个观察值。因此,每个total - agecat-drug组合的year值不止一个。由于这些值需要以某种方式汇总,reshape2抱怨:

  

缺少聚合函数:默认为长度

解决方案是聚合这些值,以获得给定年份中totalagecat的{​​{1}}之和。这可以通过设置drug

来完成
fun.aggregate = sum