Минимальная функция с ошибкой NA в R

#r

#r

Вопрос:

Я сталкиваюсь с ошибкой при использовании функции R min ().

 wip <- read.csv("WIP-01-11-11.csv") # Get WIP CSV
wip <- transform(wip, End.Date=as.Date(wip$End.Date,format='%d-%b-%y', na.rm=T))
wip <- transform(wip, Start.Date=as.Date(wip$Start.Date,format='%d-%b-%y', na.rm=T))
wip2 <- transform(wip, duration=ifelse(
                       round((wip3$End.Date - wip3$Start.Date)/30, digits = 0)==0, 
                           1,
                          round((wip3$End.Date - wip3$Start.Date)/30, digits = 0))) 
               # At this point, I get NAs
wip3 <- transform(wip2, monthsRec=min( ( 
               (2011*12 11) - as.numeric(format(wip3$Start.Date, '%Y'))*12  
                              as.numeric(format(wip3$Start.Date, '%m'))), 
               wip3$duration)
                 )
  

Почему я получаю NAs при вычислении «продолжительности» для wip2 при завершении.Дата и начало.На сегодняшний день нет NAs.

Спасибо,

Комментарии:

1. Я не думаю, что na.rm=T биты в вашем коде делают то, что вы думаете, что они делают. Итак, у вас все еще есть NAs, хотя вы можете подумать, что удалили их.

Ответ №1:

 wip3 = list()
wip3$Start.Date = as.Date('2011-01-01')
wip3$duration = 10
> min(((2011*12 11) - as.numeric(format(wip3$Start.Date, '%Y'))*12 as.numeric(format(wip3$Start.Date, '%m'))),wip3$duration)
[1] 10
  

У меня работает нормально. Есть ли у вас какие-либо NAS в ваших данных? Если это так, вы, вероятно, захотите использовать na.rm=T флаг для min() .

Комментарии:

1. Спасибо, Джон, но в данных нет NAS. Использование na.rm = T дает мне результат ‘1’, который не является тем, что я ищу.

2. @AME чтобы оказать дополнительную помощь, помимо предположения, что у вас очень распространенная проблема, о которой я упоминал выше, нам нужно будет просмотреть подмножество ваших данных, которые будут воспроизводить проблему.

3. @AME если ваш результат изменился с помощью na.rm=T , то это означает, что в ваших данных есть NAS. Возможно, они вводятся вложенными функциями, но они есть. Если вы ничего не ожидаете, вам следует проработать различные части вашего основного оператора, чтобы увидеть, где что-то идет не так.

4. Я думаю, вы к чему-то клоните, я получаю ошибки в своих расчетах для «Продолжительности» (см. Код выше). Есть идеи, почему?

5. @AME: Я не очень часто голосую в сторону понижения, но этот отказ выдавать воспроизводимые данные меня очень смущает.

Ответ №2:

Я воспроизвел вашу проблему на примере @John Colbys, если я использую неправильный корпус для wip3$start.Date :

 wip3 = list()
wip3$start.Date = as.Date('2011-01-01')
wip3$duration = 10
min(((2011*12 11) - as.numeric(format(wip3$Start.Date, '%Y'))*12 as.numeric(format(wip3$Start.Date, '%m'))),wip3$duration)
  

Которая выдает

 [1] NA
Warning messages:
1: NAs introduced by coercion 
2: NAs introduced by coercion 
  

Я подозревал, что, поскольку у вас есть wip3$duration , у вас, вероятно, тоже есть wip3$start.Date , но вы получили к ней доступ, как wip3$Start.Date указано в вашем коде. Это возвращает NULL , что плохо работает с остальными…

Комментарии:

1. Хорошее наблюдение, но, похоже, проблема не в корпусе. Спасибо.

2. @AME — Я вижу, вы обновили свой вопрос. Если у duration есть NAs, не могли бы вы попробовать wip3[which(is.na(wip3$duration)), ] , который должен показать строки, в которых есть проблемы…