无法获得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行),但仍然没有...而且当我不想更改数据时,我无法理解要应用的函数,只需要它广泛。我错过了什么?谢谢!
答案 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
但是,根据评论,实际数据集略有不同。对于给定年份中的agecat
和drug
,它似乎有多个观察值。因此,每个total
- agecat-drug
组合的year
值不止一个。由于这些值需要以某种方式汇总,reshape2
抱怨:
缺少聚合函数:默认为长度
解决方案是聚合这些值,以获得给定年份中total
和agecat
的{{1}}之和。这可以通过设置drug
:
fun.aggregate = sum