我正在尝试按预先确定的行号对此数据框进行子集化。
# 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,]
我可以手动执行此操作,但是它可以用于许多训练/测试集...因此用于循环
答案 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]
}
只需对动态创建的训练和循环内的测试帧做任何你需要的事情。