Я пытаюсь разделить этот фрейм данных на заранее определенные номера строк.

       # Make dummy data frame
 df <- data.frame(data=1:200)
        train.length <- 1:2

# Set pre determined row numbers for subsetting
train.length.1 = 1:50
test.length.1 = 50:100
train.length.2 = 50:100
test.length.2 = 100:150

train.list <- list()
test.list <- list()
# Loop for subsetting by row, using row numbers in variables above
for (i in 1:length(train.length)) {
  # subset by row number, each row number in variables train.length.1,2etc..
  train.list[[i]] <- df[train.length.[i],]  # need to place the variable train.length.n here...
  test.list[[i]] <- df[test.length.[i],] # place test.length.n variable here..
  # save outcome to lists
}

Мой вопрос: если у меня есть номера строк, хранящиеся в переменной, как мне разместить каждый [ый] номер внутри кода подмножества?

Я пытался:

df[train.length.[i],] 

Также

df[paste0"train.length.",[i],] 

Однако это вставляется как символ и не читает мою переменную train.length.n ... как показано ниже

> train.list[[i]] <- df[c(paste0("train.length.",train.length[i])),]
> train.list
[[1]]
   data data1
NA   NA    NA

Если у меня есть переменная сама по себе, она работает как задумано. Просто нужно, чтобы он работал в цикле for

Желаемый результат - распечатайте те, что ниже

train.set.output.1 <- df[train.length.1,]
test.set.output.1 <- df[test.length.1,]
train.set.output.2 <- df[train.length.2,]
test.set.output.2 <- df[test.length.2,]

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

r
1
Andrew Bannerman 1 Янв 2018 в 01:25

2 ответа

Лучший ответ

Рассмотрим смещенный seq() и передайте числовые последовательности в lapply для нарезки по строкам. Кроме того, для фреймов данных одинаковой длины вы, вероятно, планировали начинать с 1, 51, 101, ...

train_num_set <- seq(1, 200, by=50)
train.list <- lapply(train_num_set, function(i) df[c(i:(i+49)),])

test_num_set <- seq(51, 200, by=50)
test.list <- lapply(test_num_set, function(i) df[c(i:(i+49)),])
1
Parfait 1 Янв 2018 в 00:19

Создайте функцию, которая разбивает ваш фрейм данных на разные части:

split_frame_by_chunks <- function(data_frame, chunk_size) {
    n <- nrow(data_frame)
    r  <- rep(1:ceiling(n/chunk_size),each=chunk_size)[1:n]
    sub_frames <- split(data_frame,r)
    return(sub_frames)
}

Вызов функции с использованием фрейма данных и размера блока. В вашем случае вы разделяете фрейм данных на части по 50:

chunked_frames <- split_frame_by_chunks(data_frame, 50)

Определите количество разделов "поезд / тест" для создания в цикле

num_splits <- 2

Создайте соответствующие наборы поездов и тестов внутри цикла. В этом случае я создаю 2, которые вы указали в своем вопросе. (т.е. первый цикл создает поезд и тестовый набор со строками 1-50 и 50-100 соответственно):

for(i in 1:num_splits) {
   this_train <- chunked_frames[i]
   this_test <- chunked_frames[i+1]
}

Просто делайте все, что вам нужно, с динамически созданным поездом и тестовыми кадрами внутри вашего цикла.

1
Cybernetic 1 Янв 2018 в 00:54