Если вы получаете сообщение об ошибке с SQuirreL Client при выполнении SQL-запроса с точкой с запятой, например CREATE PROCEDURE, вам нужен плагин MySQL. Вы можете выбрать его при установке. Он не выбран по умолчанию.
Это сложно, как вы ожидали, из-за необходимости отбора проб без замены. Ниже приведено рабочее решение, которое позволяет получить случайную выборку и быстро решить проблему масштаба, приведенную в примере с вашей игрушкой. Это также должно быть хорошо с большим количеством наблюдений, но будет действительно очень медленным, если вам нужно будет выбрать много точек относительно размера выборки.
Основная предпосылка состоит в том, чтобы выбрать n = 10 точек, сгенерировать 10 векторов из этих точек вперед, и если векторы пересекаются, отбросить их и выбрать снова. Это просто и прекрасно работает, учитывая, что 10*n << nrow(df)
. Если вы хотите получить 15 подвекторов из ваших 200 наблюдений, это будет намного медленнее.
library(tidyverse)
library(lubridate)
date_data <- tibble(dates = c(seq(ymd("2015-03-22"),
ymd("2015-07-03"),
by = "days"),
seq(ymd("2015-08-09"),
ymd("2015-10-01"),
by = "days"),
seq(ymd("2015-11-12"),
ymd("2016-01-03"),
by = "days")),
sample_id = 0L)
# A function that picks n indices, projects them forward 10,
# and if any of the segments overlap resamples
pick_n_vec <- function(df, n = 10, out = 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
vecs <- lapply(points, function(i){i:(i+(out - 1))})
while (max(table(unlist(vecs))) > 1) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
vecs <- lapply(points, function(i){i:(i+(out - 1))})
}
vecs
}
# demonstrate
set.seed(42)
indices <- pick_n_vec(date_data)
for (i in 1:10) {
date_data$sample_id[indices[[i]]] <- i
}
date_data[indices[[1]], ]
#> # A tibble: 10 x 2
#> dates sample_id
#> <date> <int>
#> 1 2015-05-31 1
#> 2 2015-06-01 1
#> 3 2015-06-02 1
#> 4 2015-06-03 1
#> 5 2015-06-04 1
#> 6 2015-06-05 1
#> 7 2015-06-06 1
#> 8 2015-06-07 1
#> 9 2015-06-08 1
#> 10 2015-06-09 1
table(date_data$sample_id)
#>
#> 0 1 2 3 4 5 6 7 8 9 10
#> 111 10 10 10 10 10 10 10 10 10 10
Создано в 2019-01-16 с помощью пакета представитель (v0.2.1) sup>
pick_n_vec2 <- function(df, n = 10, out = 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
while (min(diff(sort(points))) < 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
}
lapply(points, function(i){i:(i+(out - 1))})
}