我在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_ID
和BORE_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
答案 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