2016-08-04 3 views
-1

POSIXctのデータフレームから行単位の最小値を探しようとしています。しかしwhich.minapplyを使用しては動作しません:POSIXctのwhich.minを適用する

df <- data.frame(date1 = as.POSIXct(c("2016-01-01", "2016-02-01")), 
       date2 = as.POSIXct(c("2015-10-01", "2016-06-01"))) 

apply(df, 1, which.min) # not OK 
# integer(0) 
# Warning messages: 
# 1: In FUN(newX[, i], ...) : NAs introduced by coercion 
# 2: In FUN(newX[, i], ...) : NAs introduced by coercion 

apply(df, 1, function(x) which(x == min(x))) # OK 
# [1] 2 1 

sapply(1:nrow(df), function(i) which.min(df[i,])) # OK 
# date2 date1 
# 2  1 

は誰がこの動作を説明できますか?

ありがとうございます!この時

+1

'apply'は' df [1、] 'を' as.matrix'で変換して、 'which.min'で解釈できない文字型の値になると思います。 –

答えて

2

ルック:

str(apply(df, 1, identity)) 
# chr [1:2, 1:2] "2016-01-01" "2015-10-01" "2016-02-01" "2016-06-01" 
# - attr(*, "dimnames")=List of 2 
# ..$ : chr [1:2] "date1" "date2" 
# ..$ : NULL 

identityを適用すると、文字にPOSIXct値を変身!これは、applyがマトリックスに入力を強制的に入力し、as.matrix.data.frameがをPOSIXct値に使用するためです。マトリックスにはアトム値しか格納できず、POSIXctなどのS3オブジェクトはアトミックではないからです。したがって、結果の行列は文字行列です。そして、あなたは文字の最小値を計算することはできません。 sapplyは入力を反復処理し、data.frameは行列に変換しません。

+0

ありがとう、ありがとう。これは、min関数を文字ベクトルに適用できるので、少し奇妙です。これは、(x == min(x))の解がPOSIXctの代わりに文字を比較し、予期しない結果をもたらす可能性があることを意味します。 – jlesuffleur

関連する問題