R:生成变量名称,评估函数列表中的函数,并将这些值分配给循环中生成的变量名称

标签 r for-loop dataframe loops variable-names

如果已经有答案,请原谅,但我无法从文件中完全弄明白。

我通过 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)

得到想要的结果。这是因为您的变量名称是 yearenteradoptyearyearleave。据我所知,您必须在函数中将 yearenter 更改为 intoobsyear,但这是一个细节。

学习使用索引会让你省去很多麻烦。如果添加一个参数就可以,请永远不要再创建 40 个相同的函数。

关于R:生成变量名称,评估函数列表中的函数,并将这些值分配给循环中生成的变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7943811/

相关文章:

javascript - For 循环不循环对象的值 - 对每个元素应用相同的处理程序

r - 按 R 中的列组长度对数据帧进行排序

python-3.x - 我想将字典转换为 pandas dataFrame

r - 散点图/火山图作为 t.test 的输出

java - 带用户输入的 For 循环。输出以空格开头

r - 创建新 R 包时如何修复 `no visible global function definition`

c - 在数组 c 中找到所有可能的对

r - 表中每列值的频率

javascript - R Shiny : Change "height" attribute of rectangle in gvisTimeline

r - 按组求和,但排除低于指定 id 的值