Temperature curve in Rdplyr::filter
- lubridate::minute
の組み合わせで奇妙な動作が発生しました。dplyrフィルタリングをlubridate :: hhmm形式で行います。
以下のテストデータdta
を参照してください。 dta$time
はlubridate::hhmm
形式です。
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
のように、
dplyr
の
filter
を使用して
結果は実際に期待通りには収まりません。 (UPDATE:Temp1
とTemp2
の値が正しいが、唯一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::filter
lubridate::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)
興味深い。 'filter'は' Formal class 'Period'を扱うことができないようです。あなたが最初に集めて( 'dta%>%gather(var、val、-Time)%>%filter(minute(Time)== 0)')フィルターしようとすると、 'Error in filter_impl(.data、 quo):結果の長さは26でなく13でなければならない ' – Sotos
私が特に奇妙なのは、中間変数を使用しても、それが存続するということです。例えば、 'tst < - 分(dta $ Time)== 0'と' dta%>%filter(tst) 'のようになります。私が見る限り、 'tst'は単なる論理的なベクトルです。 – Lyngbakr
** '** Time ** 'を除くすべての列は正しくフィルタリングされています。私は中間変数 'mutate(mins = minutes(Time))'を作成し、それをフィルタリングしようとしました。正しい行が返されましたが、 'Time'カラムは返されませんでした。 – Brian