2016-06-26 53 views
0

我有一个问题,我认为需要在R中使用lapply(尽管我对其他解决方案是开放的)。lapply in R - 函数到每一列

我有一个数据集(代码生成下面粘贴)与一个二进制变量的多个排列,这导致每个permuation一个Y.我试图运行一个使用X1-X75变量作为每个Y变量的预测变量的模型。这最终将成为一种插补模型,因此我需要的第一步是简单地对数据进行子集分类,以便每个排列都得到一个单独的数据集 - 例如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(或类似功能),以数据集中的函数适用于列的子集,与列表中的每个元素是该数据集的不同列?

这是数据生成代码:

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

哪个包是'pe​​rmute'函数?我猜这是'gtools'软件包? – nograpes

+0

'dataGen'函数返回的df的结构是什么?需要进行子集化的非常宽的obs.control和obs.tx列df?原来X1-X75是否存在?第一个代码块中的“p”是什么? 'd $ ob'是否变化或总是等于零?基本上,请发布几行数据。 – Parfait

回答

0

这将创建100个数据集,名为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) 

您可能感兴趣的考虑看看@格里高尔的答案this question一些不错的技巧与存储在列表data.frames工作。