Переодичность выборки на R

Считал данные из выборки, нужно сформировать тестовую ы обучающую выборку. Я сделал только на основе столбцов. Но я ищу способ сделать выбор через каждые 24 строки, то есть строки 1-24 в тестовую, 25-48 в обучающую и так далее. Нашел фильтрацию на основании столбцов, а вот со строками сделать не могу.

bikeData <- read.csv("SeoulBikeData.csv", fileEncoding = "ISO-8859-2")

dim(bikeData)

trSet <- subset(bikeData, select = c(2,3,8))
testSet <- subset(bikeData, select = c(2,3,8))

Ответы (2 шт):

Автор решения: O.Mazuruk

Реализировал сам алгоритм выборки(возможно есть готовая стандартная функция, но ее я не нашел):

names <- c("Rented Bike Count", "Hour", "Dew point temperature(°C)")

trSet <- data.frame()
testSet <- data.frame()

trSet[[names[1]]] <- as.integer()
trSet[[names[2]]] <- as.integer()
trSet[[names[3]]] <- as.double()

testSet[[names[1]]] <- as.integer()
testSet[[names[2]]] <- as.integer()
testSet[[names[3]]] <- as.double()

step <- 1

inc <- function(x) {
  eval.parent(substitute(x <- x + 1))
}

for(i in 1:nrow(bikeData)) { 
  if(step < 24) {
    tmp <- bikeData[i,c(2,3,8)]
    trSet <- rbind(tmp, trSet)
  } else if (step < 48) {
    tmp <- bikeData[i,c(2,3,8)]
    testSet <- rbind(tmp, testSet)
  } else {
    step <- 1
  }

  inc(step)
}
→ Ссылка
Автор решения: aleksandr barakin

функция read.csv() возвращает data.frame. выбрать из data.frame строки по их индексам можно так:

> df[вектор.с.индексами,]

чтобы выбрать строки, индексы которых не упомянуты в векторе, надо перед вектором поставить минус:

> df[-вектор.с.индексами,]

т.е., задача сводится к тому, чтобы получить последовательность из чисел «с пропусками»: n последовательных чисел, затем пропуск n чисел, затем ещё n последовательных чисел, и т.д.

значит, для n=2, и len=20 надо получить последовательность:

1 2 5 6 9 10 13 14 17 18

«ключевыми точками» являются (seq(1, len, by = n * 2)):

1 5 9 13 17

а к этим «ключевым точкам» уже можно «добавить» идущие вслед за каждой из них n-1 последовательных чисел.

чтобы не утяжелять ответ, я сразу приведу функцию, которую быстренько набросал:

вектор <- function(n, len) {
  unlist(
    lapply(
      seq(1, len - len %% n, by = n * 2),
      function(x) {
        seq(x, x + n - 1)
      }
    )
  )
}

поэкспериментируйте, разобрав её на части, чтобы понять, что там внутри происходит.

проверяем:

> вектор(2, 20)
 [1]  1  2  5  6  9 10 13 14 17 18
> вектор(3, 30)
 [1]  1  2  3  7  8  9 13 14 15 19 20 21 25 26 27

да, то, что надо.

ну а для вашего примера будет как-то так:

trSet <- bikeData[вектор(24, nrow(bikeData)),]
testSet <- bikeData[-вектор(24, nrow(bikeData)),]
→ Ссылка