如果已经有答案,请原谅,但我无法从文件中完全弄明白。
我通过 R 中的 for 循环生成了一个非常相似的函数列表:
adoptint.fun=list()
for(i in 1:40) {
#function name for each column
func.name <- paste('adoptint',i,sep='')
#function
func = paste('function(yearenter, adoptyear, yearleave) {ifelse(is.na(yearenter) | yearenter >', i+1905, ' | is.na(adoptyear) | yearleave > ', i+1905, ', NA, ifelse(yearenter <= ', i+1905, ' & adoptyear <= ', i+1905, ', 1, 0))}', sep='')
adoptint.fun[[func.name]] = eval(parse(text=func))
}
我现在有兴趣应用此函数为尚未在数据框中创建的变量生成值。我想使用循环或类似方法来执行此操作,因为在 40 次迭代中,过程是相同的,尽管具体值发生了变化。代码看起来像这样:
#generate variables that will be inserted into dataframe, dfanal.reshape
var_names <- paste("dfanal.reshape$adopt", 1:40, sep="")
#run function i to obtain values for variable i, which should be appended to dataframe
for(i in 1:40){
var_names[i] <- eval(parse(paste("adoptint.fun[[" ,i, "]](dfanal.reshape$intoobsyear,dfanal.reshape$adoptyear,dfanal.reshape$yearleave)", sep="")))
}
我已经为 var_names 段使用了 mget,但这似乎不起作用并且 eval 段也不起作用(即,没有将函数确定的值(工作正常)分配给适当的数据帧专栏。
再次,如果这个问题已经得到解答,我们深表歉意,并在此先感谢您的帮助。
最佳答案
如何为您的函数添加一个额外的参数?
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
现在没有可重现的示例(参见 How to make a great R reproducible example? ),很难猜测您想做什么以及如何更经济地做到这一点。您仍在使用大量计算时间。以下函数可能会执行您想要的操作:
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 个相同的函数。
关于R:生成变量名称,评估函数列表中的函数,并将这些值分配给循环中生成的变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7943811/