2017-01-19 3 views
1

私はghplot2でデータセットをプロットするためにreshape2 melt関数を使ってデータフレームを溶かしようとしています。しかし、タイムスタンプを含む私の参照列では、最初の反復の後にNAが返されます(タイムスタンプは1回ずつ正しく表示され、次にこれらはNAです)。ここで タイムスタンプ上のreshape2メルト関数は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.

編集 この質問は私の質問をlongに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です。 UNIXエポックからの秒数だけあるので、日付が1つだけの数として保存することができる一方で

x<-as.POSIXct("2017-01-15 15:00:00") 
typeof(x) 
#[1] "double" 
unclass(x) 
#[1] 1484488800 
#attr(,"tzone") 
#[1] "" 

POSIXct:のPOSIXctをしてみましょう。 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") 
関連する問題