用多个变量级别重塑R中的数据;聚合函数缺失“;警告

用多个变量级别重塑R中的数据;聚合函数缺失“;警告,r,reshape2,dcast,R,Reshape2,Dcast,我试图在Reforme2中使用dcast将数据帧从长格式转换为宽格式。数据是医院就诊日期和诊断列表。(Dx.num列出了一次就诊的诊断顺序。如果同一名患者返回,则此变量重新开始,新就诊的主要诊断从1开始。)我希望每个患者(id)有一行。数据结构是: id visit.date visit.id bill.num dx.code FY Dx.num 1 1/2/12 203 1234 409 2012 1 1

我试图在Reforme2中使用dcast将数据帧从长格式转换为宽格式。数据是医院就诊日期和诊断列表。(Dx.num列出了一次就诊的诊断顺序。如果同一名患者返回,则此变量重新开始,新就诊的主要诊断从1开始。)我希望每个患者(id)有一行。数据结构是:

id  visit.date  visit.id    bill.num    dx.code FY  Dx.num  
1   1/2/12      203         1234        409    2012  1      
1   3/4/12      506         4567        512    2013  1      
2   5/6/18      222         3452        488    2018  1      
2   5/6/18      222         3452        122    2018  2      
3   2/9/14      567         6798        923    2014  1 
我想我最终会有这样的专栏:

id, date_visit1, date_visit2, visit.id_visit1, visit.id_visit2,  bill.num_visit1, bill.num_visit2, dx.code_visit1_dx1, dx.code_visit1_dx2   dx.code_visit2_dx1, FY_visit1_dx1, FY_visit1_dx2, FY_visit2_dx1
最初,我尝试创建一个如下的visit_dx列:

**visit.dx** 
v1dx1 (visit 1, dx 1)
v2dx1 (visit 2, dx 1)
v1dx1 (...)
v1dx2
v1dx1
并使用以下代码,从DF中省略“Dx.num”,因为它在“visit.Dx”中有说明:


widedata.table包扩展了
dcast
并允许,因此

库(data.table)
dcast(setDT(DF),id~rowid(id),value.var=setdiff(name(DF),“id”))
id visit.date_1 visit.date_2 visit.id_2 bill.num_1 bill.num_2 dx.code_1 dx.code_2 FY_1 FY_2 dx.num_1 dx.num_2
1:  1       1/2/12       3/4/12        203        506       1234       4567       409       512 2012 2013        1        1
2:  2       5/6/18       5/6/18        222        222       3452       3452       488       122 2018 2018        1        2
3:3 2014年9月2日567 NA 6798 NA 923 NA 2014 NA 1 NA

我认为重塑2的dcast不支持multiple value.var,但您可以使用data.table:
库(data.table);dcast(setDT(DF),id~rowid(id),value.var=setdiff(name(DF),“id”))
。。我不确定你是不是在追求这个。详细信息:OP不包括所需的输出,所以我不确定这是否正确。该代码非常有用,但在我的实际数据集中,我有一个人在一次就诊中有140个诊断。但是,没有人的访问次数超过8次。所以我的问题是,当我运行你的代码时,每个“value.var”转换成140个不同的列,最后我得到了1000多个列。我只需要对dx.code和dx.num变量进行140次细分。我希望剩下的变量按访问次数细分。你认为我可能需要做两个单独的演员吗?或者只删除每个值额外的132列会更容易些。var?@vzst我认为这取决于转换数据后对数据的处理。如果只是为了浏览,我可能会使用
res=dcast(setDT(DF),id~,fun.agg=list,value.var=setdiff(names(DF),“id”)
或类似的函数(可能是使用
toString
unique的自定义函数)。或者,是的,可以选择多个dcast(然后在
id
cbind(res1,res2[,!“id]”)上合并)
    wide <-
    dcast(
    setDT(long),
    id + visit.date + visit.id + bill.num ~ visit.dx,
    value.var = c(
      "dx.code",
      "FY"
    )
  )
library(data.table)
dcast(setDT(DF), id ~ rowid(id), value.var=setdiff(names(DF), "id"))

   id visit.date_1 visit.date_2 visit.id_1 visit.id_2 bill.num_1 bill.num_2 dx.code_1 dx.code_2 FY_1 FY_2 Dx.num_1 Dx.num_2
1:  1       1/2/12       3/4/12        203        506       1234       4567       409       512 2012 2013        1        1
2:  2       5/6/18       5/6/18        222        222       3452       3452       488       122 2018 2018        1        2
3:  3       2/9/14         <NA>        567         NA       6798         NA       923        NA 2014   NA        1       NA