【问题标题】:Reshaping data in R with multiple variable levels - "aggregate function missing" warning用多个变量级别重塑 R 中的数据 - “缺少聚合函数”警告
【发布时间】:2019-01-16 04:31:02
【问题描述】:

我正在尝试使用 reshape2 中的 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”中有所说明:

    wide <-
    dcast(
    setDT(long),
    id + visit.date + visit.id + bill.num ~ visit.dx,
    value.var = c(
      "dx.code",
      "FY"
    )
  )

当我运行它时,我收到警告“缺少聚合函数,默认为 'length'”和充满 0 和 1 的新数据框。但是,数据框中没有重复的行。我开始认为我应该完全不同地处理这个问题。

任何帮助将不胜感激。

【问题讨论】:

  • 我认为 reshape2 的 dcast 不支持多个 value.var,但您可以使用 data.table:library(data.table); dcast(setDT(DF), id ~ rowid(id), value.var=setdiff(names(DF), "id")) .. 不确定这是否是您所追求的。详情:stackoverflow.com/q/23056328

标签: r reshape2 dcast


【解决方案1】:

data.table 包将dcast 扩展为rowid 并允许multiple value.var,所以...

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

【讨论】:

  • OP 不包含所需的输出,所以我不确定这是否正确。
  • 该代码非常有用,但在我的实际数据集中,我有一个人在一次访问中诊断了 140 次。但是,没有人访问超过 8 次。所以我的问题是,当我运行您的代码时,每个“value.var”都会转换为 140 个不同的列,最终得到超过 1000 个列。我只需要 dx.code 和 dx.num 变量的 140 细分。我想按访问次数细分的其余变量。你认为我可能需要做 2 次单独的演员表吗?或者删除每个 value.var 的额外 132 列会更容易吗?
  • @vzst 我认为这取决于您在转换数据后对数据的处理方式。如果只是为了浏览,我可能会使用res = dcast(setDT(DF), id ~ ., fun.agg=list, value.var=setdiff(names(DF), "id")) 或一些类似的功能(可能是使用toStringunique 的自定义功能)。或者,是的,多个 dcast 是一个选项(然后结合 idcbind(res1, res2[, !"id"]) 上的合并)
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多