Я пытаюсь создать функцию, которая показывает, сколько «человеко-лет» человек внес в данную возрастную группу в данный период.Если человек жив в течение указанного интервала, он вносит свой вклад в интервал времени.Например, для возрастной группы 0-1 человек, находившийся под наблюдением в возрасте 0,5 года и оставленный в возрасте 3 лет, внесет 0,5 года в человеко-годы в возрастной группе 0-1 года.
Мне удалось успешно запустить этот код в цикле for, но это занимает вечность, поэтому я пытаюсь реализовать векторную функцию.Функция прекрасно работает для отдельных записей, но не может обрабатывать векторы, которые я передаю ей, выдавая ошибку: «... условие имеет длину> 1, и будет использоваться только первый элемент» *
Функция Iнаписано следующее:
pyears01.smm <- function(ageent, ageleave) {
if ( is.na(ageent) | is.na(ageleave) )
{NA} else
if( ageent > 1 )
{0}
if ( ageent <= 1 && ageleave > 1 )
{1-ageent} else
if( ageent <= 1 && ageleave <= 1 )
{ageleave-ageent}
}
, который отлично работает для оценки следующего:
pyears.smm(0,5)
[1] 1
pyears.smm(0.5,0.75)
[1] 0.25
pyears.smm(2,3)
[1] 0
, но неправильно оценивает NA:
> pyears.smm(NA,NA)
[1] 0
> pyears.smm("NA",5)
[1] 0
инеправильно обрабатывает векторы:
x <- c(0,0.5,2,5)
y <- c(5,0.75,3,NA)
z<- pyears.smm(x,y)
Warning message:
In if (!is.na(ageent) & ageent <= 1 & !is.na(ageleave) & ageleave > :
the condition has length > 1 and only the first element will be used
> z
[1] 1.0 0.5 -1.0 -4.0
Я читал, что elseif принимает векторы, в то время как подобные операторы могут оценивать только отдельные элементы, но у меня есть несколько уровней вложенных операторов if, поэтому я не уверенкак это исправить.Мы ценим любые предложения.Спасибо!