Как разделить нечетные элементы данных на обучающий набор и кратные 10 для тестового набора в R? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть набор данных из 17000 экземпляров с 3 атрибутами и столбцом для целевых значений. Я должен разделить набор данных, чтобы экземпляры с нечетными позициями (1,3,5,7, ..) входили в обучающий набор data.frame, а номер экземпляра 10,20,30,40 - в набор тестов.

Ответы [ 5 ]

0 голосов
/ 02 мая 2018

Я бы предложил индексировать с помощью seq из базы r, чтобы получить очень простой и эффективный подход:

df_train <- df[seq(1, 17000,  2), ]
df_test  <- df[seq(0, 17000, 10), ]

В первом примере он генерирует вектор, который он использует для индексации, беря каждое второе число, начиная с 1 до 17000 (так что все нечетные числа), и в наборе dftest он начинает последовательность с нуля и принимает каждое десятое число , Затем они помещаются в квадратные скобки, чтобы указать, какой [rows, columns] вызывать (без указания столбцов занимает всю строку фрейма данных.

0 голосов
/ 02 мая 2018

Вы можете использовать оператор %% для модуля.

Тогда все просто:

train_set <- df[1:nrow(df) %% 2 == 0, ]
test_set <- df[1:nrow(df) %% 10 == 0, ]

Если вы собираетесь использовать пакет data.table:

library(data.table)
dt <- data.table(df)
train_set <- dt[1:(.N) %% 2 == 0]
test_set <- dt[1:(.N) %% 10 == 0]
0 голосов
/ 02 мая 2018

Вы можете использовать оператор %% для индексации

Рассмотрим x - это ваши данные. Рамка

training_set <- x[seq_len(nrow(x)) %% 2 == 1, ]  # odds
test_set <- x[seq_len(nrow(x)) %% 10 == 0, ] # multiple of 10
0 голосов
/ 02 мая 2018

Другим вариантом является использование логического вектора и переработка:

training_set <- df[c(TRUE, FALSE), ]
test_set <- df[c(rep(FALSE, 9), TRUE), ]

Это работает, потому что c(TRUE, FALSE) возвращается к числу строк во фрейме данных, и только нечетные позиции разрешаются в TRUE.

Аналогично, c(rep(FALSE, 9), TRUE)) перезагружается, и только кратные десяти разрешаются до TRUE

0 голосов
/ 02 мая 2018

Вот простое решение:

nrow<-nrow(df) #df is your dataset
training_set<-df[seq(1,nrow,by=2),] #select only odds rows
test_set<-df[seq(10,nrow,by=10),] #select only rows by 10
...