Разделение данных для тестирования поезда для модели

#r

#r

Вопрос:

У меня есть два вектора и фрейм данных. Я запускаю генератор случайных чисел, чтобы получить разделение для обучения и тестирования модели. (TRUE train при наборе тестов FALSE), при запуске многократно увеличивается количество изменений от TRUE до FALSE в количестве (FALSE варьируется от 4 до 8), а также в позиции. Это пример, фактический фрейм данных намного больше.

 x <- c(1,2,3,5,4,1,2,3,5,7,4,2,1,5,6,8,5,3,2,4,6,8,9,0,2)
y <- c(3,5,7,8,4,2,2,5,4,7,9,0,0,7,6,4,2,2,1,4,6,8,9,0,0)
X <- data.frame(x,y)

runif(nrow (X)) <= 0.75
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  
FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
 

Я хотел бы найти функцию или иметь возможность последовательно указывать генерацию разделения TRUE и FALSE со всеми элементами с именем FALSE, найденными только в конце, в то время как предыдущие элементы должны быть TRUE. Это должно дать что-то в соответствии с приведенным ниже примером.

 [1]  TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  
TRUE  TRUE  TRUE  TRUE FALSE  FALSE FALSE  FALSE FALSE  FALSE
 

Я искал функции, которые могли бы сделать это без удачи, поскольку функция, которая служит для этой цели, createTimeSlices в пакете каретки подразумевает значительные изменения в модели, которые трудно реализовать.

С другой стороны, у меня есть приведенное ниже выражение, где я получаю FALSE только в конце один раз, в то время как остальное является случайным, как и ожидалось, однако я не могу получить выражение, которое последовательно выдавало бы количество FALSE, указанное в результате разделения, которое можно найти только в последних вариантах, в то время как до этого выходилоВЕРНО, как в примере выше.

 S<- runif(nrow (X)) <=  0.75
S[length(S)] <- FALSE 
while(S[length(S)] [!FALSE]) { S<-runif(nrow (X)) <=  0.75}
train<-print(S)
 

Любая помощь приветствуется

Большое спасибо

Комментарии:

1. Итак, вы хотите выбрать нижние 25% фрейма данных, но вы не хотите, чтобы это было ровно 25% каждый раз? Я смущен вашим подходом

2. Это правильно. Случайное разделение по какой-либо причине не всегда дает одинаковое соотношение FALSE к TRUE. В примере оно варьируется от 4 до 8 количество ЛОЖНЫХ элементов

3. Зачем вам это нужно таким образом?

4. Дело не в том, что мне это нужно именно так, однако заключается в том, что это результат разделения, произведенного runif(nrow (X)) <= 0.75, он не всегда дает одинаковую пропорцию TRUE к FALSE. Я думаю, однако ответы, приведенные ниже, решили вопрос.

5. @Barnaby Я только что отредактировал свой ответ, чтобы удалить любую случайность — он всегда приближается к 75% или строкам (округлено в меньшую сторону). Это то, что вам было нужно?

Ответ №1:

Может быть, я неправильно понимаю, но не могли бы вы сделать

 S <- runif(nrow(X)) <= 0.75

sort(S,decreasing = TRUE)
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[19]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
 

это дает вам (приблизительно) TRUE значения 75%, всегда в начале вектора.

исправление?

Похоже, вам действительно нужны первые 75% строк (на основе вашего комментария выше). в этом случае я бы сделал это:

 crit <- floor(nrow(X) * 0.75)
train <- seq_len(nrow(X)) < crit
train

 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 

Ответ №2:

Почему бы не использовать sample ? В любом случае, все, что вам нужно сделать, это отсортировать ваш логический вектор:

База R:

 X$sample <- runif(nrow(X)) <= 0.75
X[order(X$sample, decreasing=TRUE), ]
 

Использование dplyr :

 library(dplyr)
X %>%
  mutate(sample = runif(nrow(X)) <= 0.75) %>%
  arrange(desc(sample))