我有一个问题,我认为需要在R中提供lapply(尽管我对其他解决方案持开放态度)。
我有一个数据集(下面生成粘贴的代码),其中包含二元变量的多个排列,每个排列都会产生一个Y.我试图运行一个模型,使用X1-X75变量作为每个Y变量的预测变量。这最终将是一个插补模型,因此我需要的第一步是简单地对数据进行子集化,以便每个排列得到一个单独的数据集 - 例如,Y.control.perm1,X1 ... X75,Y.control.perm2, X1 .... X75。
我遇到的麻烦是如何在apply语句中执行此操作。我似乎无法在同一数据集中获得感兴趣的列和预测变量。这是我的代码,其中contgrabs只有控制列,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 :(得分: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)])
}
答案 1 :(得分: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)
您可能有兴趣查看@ gregor对this question的回答,了解有关使用存储在列表中的data.frames的一些不错的提示。