6

データフレームのリストがあり、リストを介して他に機能する場合に適用したい

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

2 に答える 2

5

ifandでは動作しますが、後者は関数結果の最初の値のみを返すため、動作しelseません。ifelse

lapply(df.list, function(i) if (sum(i$cens) == 0) reg.stats(i$res) 
                            else other.stats(i$res,i$cens))

結果:

[[1]]
[1] 0.402693 1.467128

[[2]]
[1] 0.3427096 2.4269668

[[3]]
[1] 0.3731172 1.8051164

[[4]]
[1] 0.3883753 2.0028039

ところで、別の関数は必要ありません。すべて 1 つのコマンドで実行できます。

lapply(df.list, function(i) {detects <- log(i$res[i$cens == 0])
                             c(exp(mean(detects)), exp(sd(detects)))})
于 2012-12-12T17:34:39.613 に答える
0

パッケージ: plyr を見ましたか? http://cran.r-project.org/web/packages/plyr/index.html

具体的には、関数llply?

cens の値を指定して呼び出す統計関数を決定するラッパー関数を作成した場合、ラッパー関数を使用して llply を呼び出すことができるようです。

于 2012-12-12T17:42:57.257 に答える