#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)), ]
, который должен показать строки, в которых есть проблемы…