在 POSIXct 上应用 which.min

Apply which.min on POSIXct

我正在尝试从 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 

任何人都可以解释这种行为吗?

看看这个:

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 转换为矩阵。