#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))