2016-06-26 3 views
0

私は、Rでlapplyする必要があると信じている質問があります(私は他の解決策にも関わらず)。各列にR関数を適用します

私はバイナリ変数の複数の順列を持つデータセット(以下に貼り付けられるコード)を持っています。その結果、各パーミュテーションごとにYが返されます。私は、各Y変数のプレディクタとしてX1-X75変数を使用するモデルを実行しようとしています。これは最終的には代用モデルになります。そのため、最初に必要なのは、パーミュテーションごとに個別のデータセットを得るためにデータをサブセット化することです。たとえば、Y.control.perm1、X1 ... X75、Y.control.perm2、 X1 .... X75。

私が抱えている問題は、適用ステートメントでこれを行う方法です。同じデータセットに関心のある列と予測子の両方を取得することはできません。ここに私が持っているコードがあります。ここでcontはコントロールの列だけを取り、obは関心のある行です。この場合、100個のデータセット(または積み重ねられたデータセット)が必要です.Y.control.perm1 ... 100は各データセットに固有で、X1-X75はすべてに表示されます。

nperm=100 #number of permuations 
start=p+2+nperm 
cont=seq(start+1,start+nperm*2+2,by=2) #grabbing columns of interest 

test=lapply(d[which(d$ob==0),c(cont,1:p)], function(x){ 
       names(x) 
       txt.imp=as.data.frame(x[c(cont,1:p)]) 
    }) 

質問がに沸く:リストの各要素は、データセットの別の列であることで、データセット内の列のサブセットに関数を適用するためにどのようにlapply使用(または同様の機能)することができます?

この

は、データ生成コードです:これは、100個のデータセットを作成します

p=75 
N=10 
seed=342 

# FUNCTION TO GENERATE ONE SIM # 
dataGen = function(N, p, seed){ 
     set.seed(2398) 
     X=rbinom(N*p,1,.5) 
     df=data.frame(matrix(X,nrow=N,ncol=p)) 
     df$obs.txt=rep(0:1,N/2) 
     x.for.perm=df$obs.txt 
     perm=NULL 

     for(i in 1:100){ 
      perm.i=permute(x.for.perm) 
      perm=as.matrix(cbind(perm,perm.i)) 
     } 

     df$TE=-1.3*df$X1-1.2*df$X2-.6*df$X3+.3*df$X4+.5*df$X5+1.1*df$X6+1.2*df$X7 
     df=as.data.frame(cbind(df,perm)) 

     names(df) 
     seed=set.seed(seed) 
     length(df) 
     col.vec=c(76,78:177) 
     col.vec 
     df.out<-lapply(df[,col.vec],function(x){ 
      y.obs.control=rnorm(N,0,1) #observed y value under control 
      df$y.obs.tx=ifelse(x==1,(y.obs.control+df$TE),NA) #observed y value under TX 
      #df$Y=ifelse(df$obs.txt==0,df$y.obs.control,df$y.obs.tx) #observed Y value 
      df$y.obs.control=ifelse(x==0,y.obs.control,NA) #observed y value under control 
      cbind(df$y.obs.control,df$y.obs.tx) 
     }) 

     df2=do.call(cbind,df.out) 

     names=c("y.obs.control","y.obs.tx") 

     for(i in 1:100){ 
      names.i=c(paste("y.obs.control.p.",i,sep=""),paste("y.obs.tx.p.",i,sep="")) 
      names=c(names,names.i) 
     } 

     colnames(df2)<-(names) 
     df2=as.data.frame(df2) 

     df2$ob=rep(0:1,each=N/2) 
     df2$sim=rep(length(seed),each=N) 
     df2=as.data.frame(cbind(df,df2)) 

     return(df2) 
} 

d=dataGen(10,75,43) 
+0

'permute'関数のパッケージはどれですか?私はそれが 'gtools'パッケージだと思いますか? – nograpes

+0

返された 'dataGen'関数のdfの構造は何ですか?あなたがサブセット化する必要があるobs.controlとobs.txの列の幅が非常に広いですか? X1-X75はもともと存在しますか?最初のコード・ブロックで 'p'とは何ですか? 'd $ ob'は変化するか、常にゼロに等しいか?基本的には、少数のデータ行の例を投稿してください。 – Parfait

答えて

0

という名前DATASET1 ... dataset100、Y変数の一つと関心の75 X変数と各:

for(i in cont){ 
    nam <- paste("dataset", i, sep = "") 
    assign(nam, d[d$ob==0,c(i,1:75)]) 
} 
0

ここには@ hack-rの回答のlapplyバージョンがあり、その答えで構築されたものと同じdata.framesを含むリストが返されます。

# return a list of data.frames 
myList <- lapply(cont, function(i), d[d$ob==0, c(i, 1:75)]) 
# add names to the list 
names(myList) <- paste0("dataset", cont) 

あなたはリストに保存されているdata.framesでの作業にいくつかの素晴らしいヒントについてはthis questionに@グレゴールの答えを見てみに興味があるかもしれません。

関連する問題