2016-08-04 2 views
-1

Я пытаюсь найти минимальный размер строки из кадра данных POSIXct. Но использование apply с which.min не работает:Apply which.min on POSIXct

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 использует format по значению POSIXct, потому что матрица может содержать только атомные значения, а объекты S3, такие как POSIXct, не являются атомарными. Таким образом, полученная матрица является матрицей символов. И вы не можете вычислить минимум символов. sapply выполняет итерацию над своим входом и не превращает data.frame в матрицу.

+0

Хорошо, спасибо. Это немного странно, потому что функция min может быть применена к символьному вектору. Это означает, что решение (x == min (x)) сравнивает символы вместо POSIXcts и может дать неожиданные результаты! – jlesuffleur

Смежные вопросы