【问题标题】:What's the best way to reshape this data into wide format?将这些数据重塑为宽格式的最佳方法是什么?
【发布时间】:2020-02-11 04:53:48
【问题描述】:

我正在尝试将我的数据重塑为宽格式,但我是新手,到目前为止,普通的重塑功能似乎不起作用。当我尝试使用完整数据时(虽然这段摘录似乎有效),我得到了所有值的 NA 值,并且列名变成了奇怪的数字向量。

我的数据看起来像这样,PNR 是一个 id 变量,对于每个观察都是唯一的。

    PNR ZIPCODE SEL_CRITERION   QUAL_RATING QUEUENUMBER UPSEC_ID    UPSEC_COURSE_ID MARK    COURSEOFFERING_ID   ADMISSIONROUND_ID   RESULT  WITHIN_PROGRAM  SUMMA
1234567890  46395   HB      55  0   HRF         SV203       G   97116   HT2019      20  0   67.5
1234567890  46395   HB      55  0   HRF         EN200       VG  97116   HT2019      20  0   67.5
1234567890  46395   HB      55  0   HRF         MA200       VG  97116   HT2019      20  0   67.5
1234567890  46395   HB      55  0   HRF         <null>  <null>  97116   HT2019      20  0   67.5
2345678901  42332   B5      2645    0   3SB         EN1201      VG  97116   HT2019      20  0   70.5
2345678901  42332   B5      2645    0   3SB         MA1201      VG  97113   HT2019      20  0   70.5
2345678901  42332   B5      2645    0   2SM         SV1201      VG  97113   HT2019      20  0   70.5

我希望它看起来像这样:

PNR ZIPCODE      HB  B5   QUEUENUMBER UPSEC_ID SV203 EN200 MA200 <null> EN1201 MA1201 SV1201
1234567890 46395 95  NA    0           HRF      G     VG    VG    NA     NA     NA     NA
2345678901 42332 NA  1645  0           3SB      NA    NA    NA    NA     VG     VG     VG

有什么办法可以实现吗?

我尝试使用普通的 reshape 函数,但失败得很惨(虽然不一定在这个小摘录中):

test<-reshape(HT2018, idvar="PNR",timevar=c("SEL_CRITERION", "UPSEC_COURSE_ID"), v.names=c("QUAL_RATING","MARK"), direction = "wide")

我还尝试了 reshape2 包中的 melt 和 cast 函数,它返回一个包含三个值的单行(它们都不正确),尽管我当然可能做错了什么:

test<-melt(HT2018, id="PNR")
test<-cast(test, QUAL_RATING + MARK ~ PNR)

structure(list(PNR = c(1234567890, 1234567890, 1234567890, 1234567890, 
2345678901, 2345678901, 2345678901), ZIPCODE = c(46395L, 46395L, 
46395L, 46395L, 42332L, 42332L, 42332L), SEL_CRITERION = structure(c(2L, 
2L, 2L, 2L, 1L, 1L, 1L), .Label = c("B5", "HB   "), class = "factor"), 
    QUAL_RATING = c(55L, 55L, 55L, 55L, 2645L, 2645L, 2645L), 
    QUEUENUMBER = c(0L, 0L, 0L, 0L, 0L, 0L, 0L), UPSEC_ID = structure(c(2L, 
    2L, 2L, 2L, 1L, 1L, 1L), .Label = c("3SB", "HRF"), class = "factor"), 
    UPSEC_COURSE_ID = structure(c(7L, 3L, 5L, 1L, 2L, 4L, 6L), .Label = c("<null>", 
    "EN1201     ", "EN200      ", "MA1201     ", "MA200      ", 
    "SV1201     ", "SV203      "), class = "factor"), MARK = structure(c(2L, 
    3L, 3L, 1L, 3L, 3L, 3L), .Label = c("<null>", "G  ", "VG "
    ), class = "factor"), COURSEOFFERING_ID = c(97113L, 97113L, 
    97113L, 97113L, 97113L, 97113L, 97113L), ADMISSIONROUND_ID = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L), .Label = "HT2018    ", class = "factor"), 
    RESULT = c(20L, 20L, 20L, 20L, 20L, 20L, 20L), WITHIN_PROGRAM = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L), SUMMA = structure(c(1L, 1L, 1L, 
    1L, 2L, 2L, 2L), .Label = c("67.5", "70.5"), class = "factor")), class = "data.frame", row.names = c(NA, 
-7L))

【问题讨论】:

  • 在您的首选输出示例中:新列 HB 和 B5 的值是从哪里获取的?即分别为 95 和 1645。

标签: r reshape reshape2


【解决方案1】:

等待对 HB/B5 值聚合的澄清(评论),您可以使用 data.table 的 dcast() 将数据转换为跨 UPSEC_COURSE_ID MARK 级别的宽格式。

dt = data.table(dt)
dt_betyg = dcast(dt, PNR + ZIPCODE + UPSEC_ID + QUEUENUMBER + SEL_CRITERION + QUAL_RATING ~ UPSEC_COURSE_ID, value.var = c('MARK'))

结果

> dt_betyg
          PNR ZIPCODE UPSEC_ID QUEUENUMBER SEL_CRITERION QUAL_RATING <null> EN1201      EN200       MA1201      MA200       SV1201      SV203      
1: 1234567890   46395      HRF           0         HB             55 <null>        <NA>         VG         <NA>         VG         <NA>         G  
2: 2345678901   42332      3SB           0            B5        2645   <NA>         VG         <NA>         VG         <NA>         VG         <NA>

【讨论】:

  • 嗨!很抱歉没有回答。我今天早上自己解决了这个问题。事实证明,每次观察我只有一个 HB/B5 值。由于某种原因,基本的重塑功能不适用于向量,btu 因为 SEL_CRITERION 每次观察只有一个值,这并不重要。我通过使用基本的 reshape 命令两次编写解决了这个问题: test
  • 如果您的问题不违反任何规则,我会将其标记为答案。
  • 如果您的结论是您的解决方案代表了对原始查询的最合适的答案,我建议您回答自己的问题并将其标记为答案:)
猜你喜欢
  • 2017-07-20
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多