1

パッケージcut2()の関数を使用して、期間に基づいて因子を作成しようとしています。Hmisc

ここにいくつかのコードがあります:

library(Hmisc)

i.time <- as.POSIXct("2013-07-16 13:55:14 CEST")
f.time <- i.time+as.difftime(1, units="hours")

data.points <- seq(from=i.time, to=f.time, by="1 sec")
cut.points <- seq(from=i.time, to=f.time, by="60 sec")



intervals <- cut2(x=data.points, cuts=cut.points, minmax=TRUE)

data.point の各ポイントが時間間隔内に配置されるように、間隔が作成されることを期待していました。しかし、最後にいくつかの NA 値があります。

> tail(intervals, 1)
[1] <NA>
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ... [2013-07-16 14:54:14,2013-07-16 14:55:14]

このオプションminmax=TRUEにより、カットに のすべての値が確実に含まれるようになると期待していましたdata.points

ここで何が起こっているのか誰でも明確にできますか? cut2 関数を使用して、データ内のすべての値を含む因子を生成するにはどうすればよいですか?

4

2 に答える 2

5

cut2私が優先して使用する理由cutは、「右」のデフォルトが、私が期待する方法 (左閉間隔) であるためです。コードを見ると、引数リストに「カット」が存在する場合、cut関数は、間隔を左閉じにする効果を持つカットのシフトされたセットで使用され、コードは変更する要因を再ラベル付けすることがわかりますは"("to["ですが、その後は使用しませんinclude.lowest = TRUE。これには、最後の値を に変える効果があります<NA>率直に言って、これはバグだと思います。これをもっと詳しく見てみると、ヘルプページはどちらかまたはcut2どちらかを処理することを約束していないことがわかりますDatedate-timeオブジェクトなので、「バグ」が強すぎます。Date オブジェクトでは完全に失敗し、POSIXct オブジェクトではほぼ正しいのは単なる偶然のようです。(この実装は、私が常に を使用しているだけだと思っていたので、私にとってはやや驚くべきものですcut( ... , right=FALSE, include.lowest=TRUE)。)

コードを変更することができます。私が考えた 1 つのアイデアは、次の行を変更して、範囲を元のデータの右の終点まで拡張することでした。

r <- range(x,  na.rm = TRUE)

この行に:

r <- range(c(x,max(x)+min(diff(x.unique))/2),  na.rm = TRUE)

最後から 2 番目の間隔がまだ右側に開いているため、右端に新しいカテゴリが表示されるため、これはまさに私が期待した結果ではありません。

intervals <- cut3(x=data.points, cuts=cut.points, minmax=TRUE)
> tail(intervals, 1)
[1] 2013-07-16 14:55:14
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...
> tail(intervals, 2)
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14) 2013-07-16 14:55:14                      
61 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...

別のアイデアは、より満足のいく結果をもたらします。次の行のみを変更します。

y <- cut(x, k2)

これに:

y <- cut(x, k2, include.lowest=TRUE)

予想される右と左の閉区間と NA なしを与える:

 tail(intervals, 2)
[1] [2013-07-16 14:54:14,2013-07-16 14:55:14] [2013-07-16 14:54:14,2013-07-16 14:55:14]
60 Levels: [2013-07-16 13:55:14,2013-07-16 13:56:14) ...

注: include.lowestright=FALSE の =TRUE は、実際には になりinclude.highestます。そして、「正しい」パラメーターで何かをする必要もなかったのに、この場合、実際に望ましい動作が得られた理由について頭を悩ませています。私は Frank Harrell にメッセージを送りました。彼は、他のケースを処理するためにコードを修正することを喜んで検討します。私はそれに取り組んでいます。

これが問題である理由:および のラベル付けは、 (実際には) 結果のラベル付けcut.POSIXtcut.Date は異なります。前者の 2 つのラベルの戦略は、間隔の開始部分だけを再プロットすることですが、ラベル付けには "[" と ")" および間隔の終了部分が含まれます。これらの出力を比較します。cut.numericcut.defaultcut.numeric

levels( cut(0+1:100, 3) )
levels( cut(Sys.time()+1:100, 3) )
levels( cut(Sys.Date()+1:100, 3) )
于 2013-07-16T14:51:11.090 に答える
1

から??cut2:

minmax : カットが指定されているが、min(x) < min(カット) または max(x) > max(カット) の場合、最小および最大 x を含むようにカットを拡張します

引数の確認:

x=data.points
cuts=cut.points
r <- range(x, na.rm = TRUE)
 (r[1] < min(cuts) | (r[2] > max(cuts)))
FALSE ## no need to include mean and max

したがって、ここでの設定minmaxは結果を変更しません。しかし、ここでcut設定して使用した結果include.lowest=TRUE)

res <- cut(x=data.points, breaks=cut.points, include.lowest=TRUE)
table(is.na(res))
于 2013-07-16T12:30:39.403 に答える