自定义R函数返回奇怪的输出
所以我试图创建一个数据帧列表,基本上是为了通过McLappy将它们传递给多个核心。但这不是我遇到的问题。我编写了一个函数,从一个大数据帧创建一个小数据帧列表,然后依次应用它,将一个大数据帧分解为一个小数据帧列表。问题在于,当第二次调用该函数时(通过lappy调用第一个数据帧列表),它会向较大列表中的每个数据帧列表添加额外的小数据帧。我不知道为什么。我不认为它是lappy,因为当我在第一个列表的一个帧上手动运行该函数时,它也工作了。代码如下:自定义R函数返回奇怪的输出,r,functional-programming,lapply,R,Functional Programming,Lapply,所以我试图创建一个数据帧列表,基本上是为了通过McLappy将它们传递给多个核心。但这不是我遇到的问题。我编写了一个函数,从一个大数据帧创建一个小数据帧列表,然后依次应用它,将一个大数据帧分解为一个小数据帧列表。问题在于,当第二次调用该函数时(通过lappy调用第一个数据帧列表),它会向较大列表中的每个数据帧列表添加额外的小数据帧。我不知道为什么。我不认为它是lappy,因为当我在第一个列表的一个帧上手动运行该函数时,它也工作了。代码如下: create_frame_list<-funct
create_frame_list<-function(mydata,mystep,elnames){
datalim<-dim(mydata)[1]
mylist<-list()
init<-1
top<-mystep
i<-1
repeat{
if(top < datalim){
mylist[[i]]<-assign(paste(elnames,as.character(i),sep=""),data.frame(mydata[init:top,]))
}
else {
mylist[[i]]<-assign(paste(elnames,as.character(i),sep=""),data.frame(mydata[init:datalim,]))
}
if(top > datalim){break}
i<-i+1
init<-top+1
top<-top+mystep
}
return(mylist)
}
test_data<-data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))
#Create the first list of data frames, works fine
master_list<-create_frame_list(test_data,300,"bd")
#check the dimensions of the data frames created, they are correct
lapply(master_list,dim)
#create a list of lists of data frames, doesn't work right
list_list<-lapply(master_list,create_frame_list,50,"children")
#check the dimensions of the data frames in the various lists. The function when called again is making extra data frames of length 2 for no reason I can see
lapply(list_list,lapply,dim)
create_frame_list好的,所以你的代码只有一个小bug,但是肯定有更好的方法来实现这一点。当行数正好是步骤的倍数时,代码不起作用。这与断点的位置有关。这里有一个修正:
create_frame_list<-function(mydata,mystep,elnames){
datalim<-dim(mydata)[1]
mylist<-list()
init<-1
top<-mystep
i<-1
repeat{
if(top < datalim)
# mylist[[i]]<-assign(paste0(elnames,as.character(i)),data.frame(mydata[init:top,]))
mylist[[i]]<-mydata[init:top,]
else
mylist[[i]]<-mydata[init:datalim,]
# if(top > datalim) break
i<-i+1
init<-top+1
top<-top+mystep
if(init > datalim) break
}
return(mylist)
}
如果你想变得花哨,你可以做如下事情:
special.split<-function(data,step)
split(data,rep(1:ceiling(nrow(data)/step),each=step,length.out=nrow(data)))
lapply(special.split(test_data,300),special.split,step=50)
special.split非常感谢。我曾尝试使用“split”,但对它不太熟悉,我只是使用了一个循环函数,因为它不是在代码上下文中经常调用的操作。谢谢你的帮助。没问题,我用一种奇特的方式更新了我的答案。顺便说一句,我意识到在我发布问题和你的答案之间我不需要分配声明。我有时觉得它们很方便,但有时也会产生奇怪的结果。我喜欢你最后的方式,越实用越好。
special.split<-function(data,step)
split(data,rep(1:ceiling(nrow(data)/step),each=step,length.out=nrow(data)))
lapply(special.split(test_data,300),special.split,step=50)