【问题标题】:Split data to make train and test sets - for loop - insert variable to subset by row拆分数据以制作训练集和测试集 - for 循环 - 按行将变量插入子集
【发布时间】:2017-12-31 22:25:26
【问题描述】:

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

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

我可以手动执行此操作,但对于大量训练/测试集来说它很麻烦......因此 for 循环

【问题讨论】:

  • ?caret::createTimeSlices
  • 它会子集整个数据框吗?
  • 我需要将整个数据帧拆分为训练和测试时段。不确定插入符号是否可以做到这一点,第一眼,没有
  • 要拆分,只需将initialWindowhorizon 参数设置为将增加y 的观察次数的数字,例如caret::createTimeSlices(1:10, 8, 2)。如果总和较小,它将生成折叠以进行交叉验证。

标签: r


【解决方案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)),])

【讨论】:

  • 这满足了示例,在现实生活中,我需要训练集为 252 行长,测试集为 126。我无法让我在示例中尝试的方法工作?使用子集中的变量按循环执行?
【解决方案2】:

创建一个函数,将你的数据框分成不同的块:

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

只需对循环内动态创建的训练和测试帧执行任何您需要的操作即可。

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2017-11-01
    • 2017-06-11
    • 2018-06-04
    • 2019-12-11
    • 2022-10-23
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多