[英]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
,采用adoptyear
和yearleave
。 據我所知,您必須在函數yearenter
intoobsyear
更改為intoobsyear
,但這很詳細。
學習使用索引將為您節省很多挫敗感。 而且,請不要再添加40個相同的函數(如果添加一個參數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.