データフレームのリストがあり、リストを介して他に機能する場合に適用したい
df1= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0:1,5))
df2= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0,5))
df3= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0:1,5))
df4= data.frame(letter=LETTERS[1:5], res=runif(10), cens=rep(0,5))
df.list=list(df1,df2,df3,df4)
reg.stats = function(var1){
gm.reg=exp(mean(log(var1)))
gsd.reg=exp(sd(log(var1)))
return(c(gm.reg,gsd.reg))
}
other.stats = function(obs,cens){
nondetects <- obs[cens==1]
detects <- obs[cens== 0]
gm.other=exp(mean(log(detects)))
gsd.other=exp(sd(log(detects)))
return(c(gm.other,gsd.other))
}
各 df をループして、個々の df の cens 変数の合計 = 0 (つまり df2) の場合は reg.stats 関数を適用し、それ以外の場合は other.stats 関数を適用します。
実際のデータセットには、50 以上の dfs のリストがあり、過去に行ったことは、すべての cens = 0 の dfs を手動で選択し、lapply 関数を使用することでした。それは問題ありませんでしたが、データフレームを分離し、リストごとにlapplyを個別に使用してから結果を結合すると、順序が変更され、結果を並べ替える必要があります。これを行うためのより迅速でクリーンな方法はありますか?
uncens.list = df.list[c(2,4)]
uncens.res= lapply(uncens.list, function(i) reg.stats(i$res))
cens.list = df.list[c(1,3)]
cens.res.=lapply(cens.list,function(i) other.stats(i$res,i$cens))