首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lapply in R- function to each column

lapply in R- function to each column
EN

Stack Overflow用户
提问于 2016-06-26 21:11:46
回答 2查看 294关注 0票数 0

我有一个问题,我认为需要在R中应用(尽管我对其他解决方案持开放态度)。

我有一个数据集(下面粘贴的生成代码),其中包含一个二进制变量的多个排列,这会导致每个永久变量都有一个Y。我正在尝试运行一个使用X1-X75变量作为每个Y变量的预测器的模型。这最终将是一个推算模型,所以我需要的第一步是简单地对数据进行子集,这样我就可以根据排列得到一个单独的数据集-例如,Y.control.perm1,X1...X75,Y.control.perm2,X1....X75。

我遇到的麻烦是如何在apply语句中做到这一点。我似乎无法在同一数据集中同时获得感兴趣的列和预测值。这是我的代码,其中cont只获取控制列,ob是感兴趣的行。在本例中,我想要100个数据集(或一个堆叠的数据集),每个数据集的Y.control.perm1...100是唯一的,X1-X75出现在所有数据集中。

代码语言:javascript
复制
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 (或类似的函数)将函数应用于数据集中的列的子集,列表中的每个元素都是数据集的不同列?

这是数据生成代码:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2016-06-26 21:56:24

这将创建100个名为dataset1...dataset100的数据集,每个数据集都有一个Y变量和75个感兴趣的X变量:

代码语言:javascript
复制
for(i in cont){
  nam <- paste("dataset", i, sep = "")
  assign(nam, d[d$ob==0,c(i,1:75)])
}
票数 0
EN

Stack Overflow用户

发布于 2016-06-27 02:31:13

这是@hack-r答案的lapply版本,它将返回一个列表,其中包含与该答案中构造的相同的data.frames。

代码语言:javascript
复制
# 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)

您可能有兴趣看看@gregor对this question的回答,以获得一些使用列表中存储的data.frames的好技巧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38038818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档