2017-01-19 4 views
1

ghplot2를 사용하여 데이터 집합을 플롯하기 위해 reshape2 melt 함수를 사용하여 데이터 프레임을 녹이고 싶습니다. 그러나 타임 스탬프가 포함 된 참조 열을 사용하면 첫 번째 반복 이후에 NA이 표시됩니다 (타임 스탬프는 각각 한 번 올바르게 표시되고 난 다음 NA을가집니다). 여기 타임 스탬프에서 reshape2 melt 함수가 NAs를 제공합니다.

내 데이터 세트입니다 :

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.

편집 이 질문은 내 질문이 길이에 FROW 폭 변경 reshape2를 사용하는 방법에 대한 지향하지 않는 한, this one 다른, 그러나에 reshape2::melt을 할 이유 타임 스탬프에 NA 초를 제공합니다.

+0

하거나 사용'dput (데이터 세트)' – Sotos

+0

@nicola 나는 보지 않는다 쉼표가 누락되었습니다. 데이터 세트에서? –

+0

죄송합니다. 틀렸어요. 당신의 본보기입니다. – nicola

답변

1

코드의 문제는 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")