R:重塑数据,类别到列名称

时间:2014-08-19 06:26:43

标签: r reshape

我在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程序包执行此操作,因为重新设置似乎可用于较新版本的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

2 个答案:

答案 0 :(得分:3)

您的数据已经融化,因此您不再需要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

答案 1 :(得分:1)

使用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