【问题标题】:R: reshape data, category to column nameR:重塑数据,类别为列名
【发布时间】:2014-08-19 06:26:43
【问题描述】:

我在 R 中有一个如下所示的数据集:

BORE_ID     BORE_DATE       RESULT  OBS_POINT_DATUM
2413437     29/06/1905 0:00 19.81   mAHD
2413438     29/06/1905 0:00 18.9    mAHD
2413439     29/06/1905 0:00 18.9    SWL
2413441     29/06/1905 0:00 16.46   mAHD
2413441     29/06/1905 0:00 12      SWL
2413441     29/06/1905 0:00 12.5    DBNS
60912270    29/06/1902 0:00 0       mAHD
....

我正在尝试重塑它以按BORE_IDBORE_DATE 对数据进行分组,使其看起来像这样:

BORE_ID     BORE_DATE       mAHD  SWL  DBNS
2413441     29/06/1905 0:00 16.46 12   12.5
2413437     29/06/1905 0:00 19.81 NA   NA
2413438     29/06/1905 0:00 18.9  NA   NA   
2413439     29/06/1905 0:00 NA    18.9 NA   
... 

我尝试使用 reshape2 包来执行此操作,因为 reshape 似乎不适用于较新版本的 R。

这是我的尝试:

#melt the data based on id categories
melt_data <- melt(data, id=c('BORE_ID','BORE_DATE','OBS_POINT_DATUM'))

#cast back comparing ID and DATE to OBS_POINT_DATUM
cast_data <- dcast(data,'BORE_ID'+'BORE_DATE'~'OBS_POINT_DATUM', value ='RESULT')

这只会给我以下单行数据

"BORE_ID"   "BORE_DATE" OBS_POINT_DATUM
 BORE_ID    BORE_DATE   2.1

知道我哪里出错了吗? 谢谢 JP

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您的数据已经熔化,因此您无需再次melt

    library(reshape2)
    dcast(mydf, BORE_ID + BORE_DATE ~ OBS_POINT_DATUM, value.var = "RESULT")
    #    BORE_ID       BORE_DATE DBNS  mAHD  SWL
    # 1  2413437 29/06/1905 0:00   NA 19.81   NA
    # 2  2413438 29/06/1905 0:00   NA 18.90   NA
    # 3  2413439 29/06/1905 0:00   NA    NA 18.9
    # 4  2413441 29/06/1905 0:00 12.5 16.46 12.0
    # 5 60912270 29/06/1902 0:00   NA  0.00   NA
    

    你也可以在基础 R 中这样做:

    reshape(mydf, direction = "wide", 
            idvar = c("BORE_ID", "BORE_DATE"), 
            timevar = "OBS_POINT_DATUM")
    #    BORE_ID       BORE_DATE RESULT.mAHD RESULT.SWL RESULT.DBNS
    # 1  2413437 29/06/1905 0:00       19.81         NA          NA
    # 2  2413438 29/06/1905 0:00       18.90         NA          NA
    # 3  2413439 29/06/1905 0:00          NA       18.9          NA
    # 4  2413441 29/06/1905 0:00       16.46       12.0        12.5
    # 7 60912270 29/06/1902 0:00        0.00         NA          NA
    

    【讨论】:

    • 好吧,你刚刚让我意识到我在 dcast 中的名字上有引号。把这些拿出来,我的原作就好了.... R 是一个有趣的老野兽
    【解决方案2】:

    使用dplyr

     library(dplyr)
     library(tidyr)
    
     mydf %>% 
     spread(OBS_POINT_DATUM, RESULT)
     #   BORE_ID       BORE_DATE DBNS  mAHD  SWL
     #1  2413437 29/06/1905 0:00   NA 19.81   NA
     #2  2413438 29/06/1905 0:00   NA 18.90   NA
     #3  2413439 29/06/1905 0:00   NA    NA 18.9
     #4  2413441 29/06/1905 0:00 12.5 16.46 12.0
     #5 60912270 29/06/1902 0:00   NA  0.00   NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2021-10-20
      • 2020-07-08
      • 2020-10-16
      • 2022-12-05
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多