繁体   English   中英

R:生成变量名,在函数列表中求值一个函数,然后在循环内将这些值分配给生成的变量名

[英]R: Generate variable names, evaluate a function within a list of functions, and assign those values to the generated variable names within a loop

如果对此已经有答案,请原谅,但是我不能从档案中找出答案。

我已经通过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段也无法正常工作(即,未将函数确定的值(可以正常工作)分配给适当的dataframe列。

再次致歉,如果已回答您,请在此先感谢您的帮助。

如何在函数中添加额外的参数?

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 ,采用adoptyearyearleave 据我所知,您必须在函数yearenter intoobsyear更改为intoobsyear ,但这很详细。

学习使用索引将为您节省很多挫败感。 而且,请不要再添加40个相同的函数(如果添加一个参数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM