簡體   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