R 扩展多个分组变量中的一个而不应用函数

R 扩展多个分组变量中的一个而不应用函数,r,reshape2,tidyr,R,Reshape2,Tidyr,在做一些我认为很简单的事情时,无论是tidyr、重塑还是重塑都有困难 有如下数据: agecat year Drug total <1 1999 Amikacin 12 <1 1999 Cefepime 3 <1 1999 Ceftazidime 13 <1

在做一些我认为很简单的事情时,无论是tidyr、重塑还是重塑都有困难

有如下数据:

    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
agecat年度药物总量

问题数据:

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))
然而,根据评论,实际数据集有点不同。在给定的年份内,它似乎对
agecat
药物
进行了不止一次观察。因此,每种
agecat药物
-
组合的
total
值不止一个。由于这些值需要以某种方式进行聚合,
restrape2
抱怨:

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

解决方案是对给定年份的
agecat
药物的
值进行聚合,得到
total
之和。这是通过设置
fun.aggregate=sum

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

您可以通过
tidyr
spread
实现您的目标:

library(tidyr)
spread(df, year, 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
library(tidyr)
价差(df、年份、总额)
agecat药物1999-2000

1您是否正在寻找
reforme2::dcast(df,agecat+Drug~year,value.var=“total”)
?您好@user2706569,谢谢,我想是这样的,但出于某种原因,'value.var'参数不起作用,它说“聚合函数缺失:默认为长度”,这意味着每个条目都是1或2。在您显示的数据中,每年对每只agecat和每种药物只进行一次观察。在您的数据集中,情况似乎并非如此。因此,
reformae2
询问您如何汇总agecat药物年观察值。每个梳只有一个观察值。年龄+年份+药物。我认为问题在于总数有时会重复,但是放置一个唯一的ID(1:n行)并运行agemUpdate:将原始表按“年”进行分组,然后按“agecat”进行分组,允许第一个重塑函数
重塑2::dcast(df,agecat+药物~year,value.var=“total”)
工作!为什么?
dcast(df, agecat + Drug ~ year, value.var = "total", fun.aggregate = sum)
library(tidyr)
spread(df, year, 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