Как насчет добавления дополнительного аргумента в вашу функцию?
func <- function(yearenter, adoptyear, yearleave,i) {
ifelse(is.na(yearenter) | yearenter > i+1905 | is.na(adoptyear) | yearleave > i+1905 , NA,
ifelse(yearenter <= i+1905 & adoptyear <= i+1905, 1, 0))
}
Это позволит вам сделать замену намного проще, используя тот факт, что фрейм данных представляет собой особый вид списка.Я думаю, это была ваша первоначальная проблема:
for(i in 1:40){
varname <- paste('adopt',i,sep='')
dfanal.reshape[[varname]] <-
with(dfanal.reshape,
func(intoobsyear,adoptyear,yearleave,i)
)
}
Проверьте также страницы справки ?which
и ?Extract
Теперь без воспроизводимого примера (см. Как сделать отличный RВоспроизводимый пример? ), трудно догадаться, что вы хотите сделать и как сделать это более экономичным.Вы все еще используете много времени для расчета.Следующая функция может делать то, что вы хотите:
func <- function(df,j){
out <- matrix(0,nrow=nrow(df),ncol=j)
attach(df)
idna <- sapply(1:j,function(i)
is.na(yearenter) | yearenter > i+1905 | is.na(adoptyear) | yearleave > i+1905
)
out[idna] <- NA
id1 <- sapply(1:j,function(i)
yearenter <= i+1905 & adoptyear <= i+1905
)
out[id1] <- 1
detach(df)
colnames(out)<- paste('adopt',1:j,sep='')
cbind(df,out)
}
, которая позволяет просто сделать
dfanal.reshape <- func(dfanal.reshape,40)
, чтобы получить желаемый результат.Это означает, что имена ваших переменных yearenter
, adoptyear
и yearleave
.Насколько я понимаю, вы должны изменить yearenter
на intoobsyear
в функции, но это деталь.
Изучение использования индексов избавит вас от многих разочарований.И, пожалуйста, никогда больше не создавайте 40 одинаковых функций, если добавится один аргумент.