在POSIXct上应用which.min

时间:2016-08-04 08:39:59

标签: r apply posixct which

我试图从POSIXct的数据框中找到行方式最小值。但是将applywhich.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 个答案:

答案 0 :(得分: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值上使用format,因为矩阵只能保存原子值,而像POSIXct这样的S3对象不是原子的。因此,得到的矩阵是字符矩阵。而且你无法计算出最小的字符数。 sapply对其输入进行迭代,并且不会将data.frame转换为矩阵。