通过采用不同的行间隔选择多个子集并将函数应用于所有子集

时间:2011-08-13 08:54:55

标签: r

如何通过取第n行来从数据框中选择n个子集 子集1然后是子集2的第n + 1行,然后是子集3的第n + 3,直到nth = n

我用过

subset<-data[seq(nth,length,n),]

但是这给了一个子集然后我必须继续从1 ... n改变n来变得不同 subsets.e.g使用小数据(106行x 742列)设置为每10行获得10个子集

 subset1<-data[seq(1,106,10),]
 subset2<-data[seq(2,106,10),]
 subset3<-data[seq(3,106,10),]

有没有办法更好地做到这一点?

通过常见问题我尝试使用

之类的循环
sub<-function(data,nth,length,n){
         sub<-data[seq(nth,length,n),]
         for(n in 1:(sub)){
         sub2<-sub[nth,]+1,sub3<-sub[nth,]+2,sub4<-sub[nth,]+3) }
      su<-(sub,sub2, sub3,sub4)
     return(su)
    } 
sub(data=gag11p,n=1,length=106,10)

这返回3个数据列表,只有数据框中的最后一个变量,我不知道哪里出错了,我怎么才能得到名字 我希望将PLS校准函数应用于创建的子集

,而不是数据帧

请原谅并纠正任何错误,因为我现在正在学习编程和R。

2 个答案:

答案 0 :(得分:3)

使用lapply从@Chase借用函数构思的单行代码。

foo2 = function(data, nSubsets, nSkip){
   lapply(1:nSubsets, function(n) data[seq(n, NROW(data), by = nSkip),])
} 

foo2(mtcars, 5, 15)

答案 1 :(得分:2)

我建议您将所有这些不同的子集存储到单个list对象中。我不确定我是否100%遵循上面的代码,但我认为这可以做到你想要的:

FOO <- function(data, nSubsets, nSkip){
  outList <- vector("list", length = nSubsets)
  totRow <- nrow(data)

  for (i in seq_len(nSubsets)) {
    rowsToGrab <- seq(i, totRow, nSkip)
    outList[[i]] <- data[rowsToGrab ,] 
  }
  return(outList)
}

发生了什么事?

  1. 我们首先预先分配一个与您要制作的子集数量相对应的列表对象
  2. 定义总行数,这样您就不必将其作为参数传递给函数
  3. 使用类似于您用来确定要抓取哪些行的for循环,然后将其定义到上面定义的列表
  4. 返回列表对象。
  5. 以下是使用mtcars数据的示例。请注意,数据集只有32行,因此该函数会自动处理超出范围的下标,并且不会抛出警告/错误:

    FOO(mtcars,5,15)

    [[1]]
                         mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4           21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 #row 1
    Lincoln Continental 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4 #row 16
    Maserati Bora       15.0   8  301 335 3.54 3.570 14.60  0  1    5    8 #row 31
    
    [[2]]
                       mpg cyl disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 #row 2
    Chrysler Imperial 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4 #row 17
    Volvo 142E        21.4   4  121 109 4.11 2.780 18.60  1  1    4    2 #row 32
    
    [[3]]
                mpg cyl  disp hp drat   wt  qsec vs am gear carb
    Datsun 710 22.8   4 108.0 93 3.85 2.32 18.61  1  1    4    1 #row 3
    Fiat 128   32.4   4  78.7 66 4.08 2.20 19.47  1  1    4    1 #row 18
    
    [[4]]
                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 #row 4
    Honda Civic    30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2 #row 19
    
    [[5]]
                       mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2 #row 5
    Toyota Corolla    33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 #row 20