拆分数据以生成列车和测试集 - 用于循环 - 将变量插入到子集中

时间:2017-12-31 22:25:26

标签: r

我正在尝试按预先确定的行号对此数据框进行子集化。

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

我的问题是,如果我将行号存储在变量中,我如何将每个[ith]一个放在子集代码中?

我试过了:

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,]

我可以手动执行此操作,但是它可以用于许多训练/测试集...因此用于循环

2 个答案:

答案 0 :(得分:1)

考虑交错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 :(得分:1)

创建一个将数据框拆分为不同块的函数:

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]
}

只需对动态创建的训练和循环内的测试帧做任何你需要的事情。