Переодичность выборки на 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 шт):
Реализировал сам алгоритм выборки(возможно есть готовая стандартная функция, но ее я не нашел):
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)
}
функция 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)),]