2

すでに答えがありますが、アーカイブからはわかりません。

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セグメントも機能していません(つまり、関数によって決定された値(正常に機能します)を適切なデータフレーム列に割り当てていません)。

繰り返しになりますが、これがすでに回答されている場合はお詫び申し上げます。ご協力いただきありがとうございます。

4

1 に答える 1

7

関数に追加の引数を追加するのはどうですか?

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 reprobible 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)

目的の結果を得るために。これは、変数の名前がyearenteradoptyearおよびであることが前提ですyearleave。私が見る限り、関数内で変更yearenterする必要がありますが、それは詳細です。intoobsyear

インデックスの使い方を学ぶことで、フラストレーションを大幅に軽減できます。そして、1 つの引数を追加するだけで済むのであれば、40 個の同一の関数を二度と作成しないでください。

于 2011-10-30T10:06:45.427 に答える