Выберите несколько подмножеств, взяв разные интервалы строк и применив функцию ко всем подмножествам. - PullRequest
5 голосов
/ 13 августа 2011

Как выбрать n подмножеств из фрейма данных, взяв каждую n-ю строку для подмножество 1, затем nth +1 строка для подмножества 2, затем nth + 3 для подмножества 3, пока nth = n

Я использовал

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

Но это дает одно подмножество, тогда я должен продолжать менять nth с 1 ... 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 ]

3 голосов
/ 13 августа 2011

Один вкладыш, использующий lapply, заимствуя идею функции из @ Chase.

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

foo2(mtcars, 5, 15)
2 голосов
/ 13 августа 2011

Я предлагаю вам сохранить все эти различные подмножества в одном 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. Возвращать объект списка.

Вот пример использования данных mtcars. Обратите внимание, что набор данных имеет только 32 строки, поэтому функция автоматически обрабатывает подписки, которые выходят за пределы и не выдает предупреждение / ошибку:

FOO (мтс, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...