2017-08-21 10 views
2

Temperature curve in Rdplyr::filter - lubridate::minuteの組み合わせで奇妙な動作が発生しました。dplyrフィルタリングをlubridate :: hhmm形式で行います。

以下のテストデータdtaを参照してください。 dta$timelubridate::hhmm形式です。

1は、このような lubridate::minuteを使用してサブセットでき
library(lubridate) 
library(dplyr) 

dta$Time <- hm(dta$Time) 

フル時間(すなわち0分)で行のみを取得するには:

dta[minute(dta$Time) == 0,] 
#  Time Temp1 Temp2 
# 1  0S 18.62800 18.54458 
# 7 1H 0M 0S 18.45733 18.22625 
# 13 2H 0M 0S 18.33258 18.04142 

しかし、この

dta %>% filter(minute(Time) == 0) 
#  Time Temp1 Temp2 
# 1  0S 18.62800 18.54458 
# 2 10M 0S 18.45733 18.22625 
# 3 20M 0S 18.33258 18.04142 
のように、 dplyrfilterを使用して

結果は実際に期待通りには収まりません。 (UPDATETemp1Temp2の値が正しいが、唯一Timeが...ところで、このヒントを与えるため@Brianのおかげで破損しています。)

はさらに、この警告が返されます。

Warning message: In format.data.frame(x, digits = digits, na.encode = FALSE) : corrupt data frame: columns will be truncated or padded with NAs

これも報告されていて、何らかの形で解決されましたが、強制的にのみ、ルブライドの楽しい(そして非常に読みやすい)部分が削除されているようです。

質問:などの文字にそれを強制することなく、dplyr::filterlubridate::hhmm(ss)形式に(これまでの)方法はありますか?

更新:

minute(dta$Time) 
# [1] 0 10 20 30 40 50 0 10 20 30 40 50 0 

によって作成されたベクトルは、数値ベクトルのように見える、まだいくつかの神秘的な特性を持っているように見えるようです。

さらに、@ Lyngbakrは、==との比較でも、通常の論理ベクトルとしての通常の特性を持たないことを指摘しています。

tst <- minute(dta$Time) == 0 
dta %>% filter(tst) 

は、同じ奇妙なTimeの列になります。

サンプルデータ:

dta <- read.table(text = "  Time  Temp1  Temp2 
          1 00:00  18.62800 18.54458 
          2 00:10  18.60025 18.48283 
          3 00:20  18.57250 18.36767 
          4 00:30  18.54667 18.36950 
          5 00:40  18.51483 18.36550 
          6 00:50  18.48325 18.34783 
          7 01:00  18.45733 18.22625 
          8 01:10  18.43767 18.19067 
          9 01:20  18.41583 18.22042 
          10 01:30  18.39608 18.21225 
          11 01:40  18.37625 18.18658 
          12 01:50  18.35633 18.05942 
          13 02:00  18.33258 18.04142", header = T) 
+1

興味深い。 'filter'は' Formal class 'Period'を扱うことができないようです。あなたが最初に集めて( 'dta%>%gather(var、val、-Time)%>%filter(minute(Time)== 0)')フィルターしようとすると、 'Error in filter_impl(.data、 quo):結果の長さは26でなく13でなければならない ' – Sotos

+3

私が特に奇妙なのは、中間変数を使用しても、それが存続するということです。例えば、 'tst < - 分(dta $ Time)== 0'と' dta%>%filter(tst) 'のようになります。私が見る限り、 'tst'は単なる論理的なベクトルです。 – Lyngbakr

+0

** '** Time ** 'を除くすべての列は正しくフィルタリングされています。私は中間変数 'mutate(mins = minutes(Time))'を作成し、それをフィルタリングしようとしました。正しい行が返されましたが、 'Time'カラムは返されませんでした。 – Brian

答えて

1

この作品、なぜ私は知らないが、それはありません:Time列はタイプdatetime、ないPeriodであることが必要です。

dta %>% 
    mutate(Time = as_datetime(hm(Time))) %>% 
    filter(minute(Time) == 0) 
    Time Temp1 Temp2 
1 1970-01-01 00:00:00 18.62800 18.54458 
2 1970-01-01 01:00:00 18.45733 18.22625 
3 1970-01-01 02:00:00 18.33258 18.04142 

これはちょうどUnixエポックにTime欄に時間を追加することの副作用を持っているので、あなたは時間のみを使用しているとき、私は、実際の日付を含め、常に助言しますデータ。

これが実験の開始から数分経過した場合、それほど重要ではありません。1970-01-01の部分を表示する必要はありません。

+0

このポストへのあなたの答えをありがとう。しかし、datetime形式にはまだいくつかの強制が必要なので、議論を続けるために受け入れられたとはまだマークしません。 – loki

+0

@ロキ、期間のようなS4クラスはデータフレームでうまく動かないと思う。ベクトルには単一の値ではなく、6つのスロットがあります。 '?lubridate :: \' Period-class \ ''を見て、それらの算術演算が最初に強制的に強制終了してからバックコーナーにしてフードの下で実行されることを集めます。 – Brian

+0

はい、そんな感じです。 @Lyngbakrが指摘したように、 'str(分(dta $ Time)) num [1:13] 0 10 20 30 40 50 0 10 20 30 .. ..'は数値ベクトルであっても処理されないようです(または '=='で比較すると論理的です)。 – loki

関連する問題