簡體   English   中英

時間戳上的 reshape2 熔化函數給出了 NA

[英]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 請記住, POSIXltPOSIXct雖然從外觀上非常相似,但有很大的不同。 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 時代的秒數,因此日期可以存儲為單個數字。 POSIXctPOSIXlt輕。

雖然可以在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM