[英]reshape2 melt function on timestamps gives NAs
我正在嘗試使用 reshape2 melt
函數熔化數據框,以便用 ggplot2 繪制我的數據集。 但是,對於包含時間戳的我的參考列,它在第一次迭代后給了我NA
(每個時間戳正確顯示一次,然后我有這些NA
)。
這是我的數據集:
TIMESTAMP,RECNUM,Tair,Tground
2015-01-06 16:27,1,5.0,7.0
2015-01-06 16:28,2,6.0,7.0
2015-01-06 16:29,3,6.0,7.0
2015-01-06 16:30,4,6.5,7.0
2015-01-06 16:31,5,6.8,7.1
2015-01-06 16:32,6,6.8,7.1
2015-01-06 16:33,7,6.8,7.12
2015-01-06 16:34,8,7.1,7.1
2015-01-06 16:35,9,7.15,7.09
2015-01-06 16:36,10,7.18,7.1
2015-01-06 16:37,11,7.3,7.1
我的R代碼:
library(ggplot2)
library(reshape2)
datafile <- file.choose()
dat <- read.csv(datafile)
dat$TIMESTAMP <- as.POSIXlt(strptime(dat$TIMESTAMP,"%Y-%m-%d %H:%M"))
meltedData = melt(dat, id.vars=c("RECNUM", "TIMESTAMP"), variable.name="Measure")
以及由此產生的meltedData
變量:
> meltedData
RECNUM TIMESTAMP Measure value
1 1 2015-01-06 16:27:00 Tair 5.00
2 2 2015-01-06 16:28:00 Tair 6.00
3 3 2015-01-06 16:29:00 Tair 6.00
4 4 2015-01-06 16:30:00 Tair 6.50
5 5 2015-01-06 16:31:00 Tair 6.80
6 6 2015-01-06 16:32:00 Tair 6.80
7 7 2015-01-06 16:33:00 Tair 6.80
8 8 2015-01-06 16:34:00 Tair 7.10
9 9 2015-01-06 16:35:00 Tair 7.15
10 10 2015-01-06 16:36:00 Tair 7.18
11 11 2015-01-06 16:37:00 Tair 7.30
12 1 <NA> Tground 7.00
13 2 <NA> Tground 7.00
14 3 <NA> Tground 7.00
15 4 <NA> Tground 7.00
16 5 <NA> Tground 7.10
17 6 <NA> Tground 7.10
18 7 <NA> Tground 7.12
19 8 <NA> Tground 7.10
20 9 <NA> Tground 7.09
21 10 <NA> Tground 7.10
22 11 <NA> Tground 7.10
我究竟做錯了什么 ? 有沒有辦法讓所有表都具有正確的時間戳?
謝謝,
J。
編輯這個問題是從不同的這一個,因為我的問題不是如何使用reshape2來改變FROW寬長為導向,但為什么reshape2::melt
給我NA
S於時間戳。
您的代碼的問題源於您已將TIMESTAMP
列強制為POSIXlt
。 請記住, POSIXlt
和POSIXct
雖然從外觀上非常相似,但有很大的不同。 POSIXlt
實際上是一個列表。 嘗試例如:
x<-as.POSIXlt("2017-01-15 15:00:00")
typeof(x)
#[1] "list"
unclass(x)
#$sec
#[1] 0
#$min
#[1] 0
#$hour
#[1] 15
#$mday
#[1] 15
#...
如您所見, POSIXlt
對象是一個包含指示日期的秒、分、小時等元素的list
。 讓我們POSIXct
:
x<-as.POSIXct("2017-01-15 15:00:00")
typeof(x)
#[1] "double"
unclass(x)
#[1] 1484488800
#attr(,"tzone")
#[1] ""
另一方面, POSIXct
只是 UNIX 時代的秒數,因此日期可以存儲為單個數字。 POSIXct
比POSIXlt
輕。
雖然可以在data.frame
有一列是一個列表,但最好有POSIXct
:
dat$TIMESTAMP <- as.POSIXct(strptime(dat$TIMESTAMP,"%Y-%m-%d %H:%M"))
#this works now as intended
melt(dat, id.vars=c("RECNUM", "TIMESTAMP"), variable.name="Measure")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.