установить подкадр данных на основе матрицы номеров строк и сохранить результат в одном списке - PullRequest
0 голосов
/ 30 июня 2018

У меня есть фрейм данных с именем df , который выглядит следующим образом:

> df
   Date  A  B  C
1  2001  1 12 14
2  2002  2 13 15
3  2003  3 14 16
4  2004  4 15 17
5  2005  5 16 18
6  2006  6 17 19
7  2007  7 18 20
8  2008  8 19 21
9  2009  9 20 22
10 2010 10 21 23

и матрица с именем index , которая выглядит следующим образом:

> index
     Resample01 Resample02 Resample03 Resample04 Resample05
[1,]          1          7          1          2          7
[2,]          3          9          2          3          8
[3,]          5          1          3          8          1
[4,]          8          3          4          9          4
[5,]         10          4          5         10          9

Числа в каждом столбце обозначают номер строки, которую нужно выбрать.

Цель состоит в том, чтобы разбить информационный кадр на две исключительные группы «train» и «test» в соответствии с номерами строк в каждом столбце матрицы «index». Например, для «Resample01» результат должен выглядеть следующим образом:

> train
   Date  A  B  C
1  2001  1 12 14
3  2003  3 14 16
5  2005  5 16 18
8  2008  8 19 21
10 2010 10 21 23

и

> test
  Date A  B  C
2 2002 2 13 15
4 2004 4 15 17
6 2006 6 17 19
7 2007 7 18 20
9 2009 9 20 22

и этот процесс должен быть выполнен для каждого столбца в «index», а результаты должны быть сохранены в двух списках «train» и «test» , в которых «train» имеет вид:

$train1
       Date  A  B  C
    1  2001  1 12 14
    3  2003  3 14 16
    5  2005  5 16 18
    8  2008  8 19 21
    10 2010 10 21 23

$train2
:
:
$train5

и «test» должны быть в одном формате.

Только для того, чтобы заметить, что мой df содержит 43 000 наблюдений, а матрица index содержит 2000 столбцов и более 20 000 строк. Я знаю, что поднабор для одного столбца прост, выполнив:

test = df[-c(index[,1]),]

но для нескольких столбцов я не знаю, как это сделать (или зациклить), и форма сохранения списка также кажется сложной.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Решение от акрун решает мою проблему.

от @Roman Luštrik коды:

listofsample = apply(index, MARGIN = 2, FUN = function(x, data) {
  list(train = df[x, ], test = df[-x, ])
 }, data = df)

следующий код от akrun :

train = sapply(listofsample, `[`,1)
test = sapply(listofsample, `[`,2)

он производит два списка, которые я хотел.

0 голосов
/ 30 июня 2018

Вы можете попробовать что-то вроде этого. Результат должен иметь длину ncol(index), и каждый элемент должен содержать два элемента списка, каждый из наборов данных для обучения и тестирования.

apply(index, MARGIN = 2, FUN = function(x, data) {
  # is is "demoted" from a column to a vector
  list(train = data[x, ], test = data[-x, ])
}, data = df)
...