时间戳上的 reshape2 熔化函数给出 NA
reshape2 melt function on timestamps gives NAs
我正在尝试使用 reshape2 melt
函数融化数据框,以便使用 ggplot2 绘制我的数据集。但是,对于包含时间戳的我的参考列,它在第一次迭代后给了我 NA
(时间戳每次都正确显示一次,然后我有这些 NA
s)。
这是我的数据集:
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
我做错了什么?有没有办法让所有 table 长的时间戳都正确?
谢谢,
J.
编辑
这个问题与 this one 不同,因为我的问题不是针对如何使用 reshape2 将 frow wide 更改为 long,而是针对为什么 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")
我正在尝试使用 reshape2 melt
函数融化数据框,以便使用 ggplot2 绘制我的数据集。但是,对于包含时间戳的我的参考列,它在第一次迭代后给了我 NA
(时间戳每次都正确显示一次,然后我有这些 NA
s)。
这是我的数据集:
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
我做错了什么?有没有办法让所有 table 长的时间戳都正确?
谢谢,
J.
编辑
这个问题与 this one 不同,因为我的问题不是针对如何使用 reshape2 将 frow wide 更改为 long,而是针对为什么 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")