Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义R函数返回奇怪的输出_R_Functional Programming_Lapply - Fatal编程技术网

自定义R函数返回奇怪的输出

自定义R函数返回奇怪的输出,r,functional-programming,lapply,R,Functional Programming,Lapply,所以我试图创建一个数据帧列表,基本上是为了通过McLappy将它们传递给多个核心。但这不是我遇到的问题。我编写了一个函数,从一个大数据帧创建一个小数据帧列表,然后依次应用它,将一个大数据帧分解为一个小数据帧列表。问题在于,当第二次调用该函数时(通过lappy调用第一个数据帧列表),它会向较大列表中的每个数据帧列表添加额外的小数据帧。我不知道为什么。我不认为它是lappy,因为当我在第一个列表的一个帧上手动运行该函数时,它也工作了。代码如下: create_frame_list<-funct

所以我试图创建一个数据帧列表,基本上是为了通过McLappy将它们传递给多个核心。但这不是我遇到的问题。我编写了一个函数,从一个大数据帧创建一个小数据帧列表,然后依次应用它,将一个大数据帧分解为一个小数据帧列表。问题在于,当第二次调用该函数时(通过lappy调用第一个数据帧列表),它会向较大列表中的每个数据帧列表添加额外的小数据帧。我不知道为什么。我不认为它是lappy,因为当我在第一个列表的一个帧上手动运行该函数时,它也工作了。代码如下:

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)