拆分R数据帧不需要';不保留行名称

拆分R数据帧不需要';不保留行名称,r,slice,R,Slice,我试图将数据帧拆分为滚动块,存储在列表中,用于交叉验证 这是我的代码: split_data <- function(data, window.size) { windows.count = NROW(data) - window.size res = vector(mode="character", windows.count) print(head(data)) # (1) for(d in 0:windows.count) { res[d+1] <-

我试图将数据帧拆分为滚动块,存储在列表中,用于交叉验证

这是我的代码:

split_data <- function(data, window.size) {
  windows.count = NROW(data) - window.size
  res = vector(mode="character", windows.count)
  print(head(data)) # (1)

  for(d in 0:windows.count) {
    res[d+1] <- data[(1+d):(window.size + d),,drop=FALSE]
    print(head(res[[d+1]])) # (2)
  }

  return(res)
}
运行函数
split_data(dats,2)

所需的输出是数据帧列表:

       dats
test1     1
test2     2

       dats
test2     2  
test3     3

       dats
test3     3
test4     4

       dats
test4     4
test5     5

       dats
test5     5
test6     6

我会把实际的列表输出,但我不能让它生成。对于列表中的每个元素,这应该能够很好地指示列表中应该包含的内容。

您需要将mode=“character”更改为“list”。您正在尝试将data.frames存储在字符向量中,但为了实现这种方法,您需要一个列表

另外,将res[d+1]修改为res[[d+1]]。假设res现在是一个列表,res[d+1]返回一个列表,其中res[[d+1]]返回其中包含的data.frame。这是一个很好的差异概述:

以下是修改后的函数和示例:

split_data <- function(data, window.size) {
  windows.count = NROW(data) - window.size
  res = vector(mode="list", windows.count)

  for(d in 0:windows.count) {
    res[[d+1]] <- data[(1+d):(window.size + d),,drop=FALSE]
  }

  return(res)
} 

label <- c("test1", "test2", "test3", "test4", "test5", "test6")
dat <- c(1, 2, 3, 4, 5, 6)
dats <- data.frame(dat)
rownames(dats) <- label

split_data(dats,  2)

split_data(mtcars, 10) # example with mtcars dataset

split_data请提供一个起始数据集和所需的输出。@Abdou给出了我想要的输出和示例数据集的最佳指示。此外,我还对其进行了编辑,使其表示行名称而不是列名。如果要避免所有预分配和循环代码,还应使用
lappy(1:(nrow(dats)-wind+1),function(x)dats[x:(x+wind-1),,drop=FALSE])
?你能用这个更新你的答案吗?更新了,希望有帮助
split_data <- function(data, window.size) {
  windows.count = NROW(data) - window.size
  res = vector(mode="list", windows.count)

  for(d in 0:windows.count) {
    res[[d+1]] <- data[(1+d):(window.size + d),,drop=FALSE]
  }

  return(res)
} 

label <- c("test1", "test2", "test3", "test4", "test5", "test6")
dat <- c(1, 2, 3, 4, 5, 6)
dats <- data.frame(dat)
rownames(dats) <- label

split_data(dats,  2)

split_data(mtcars, 10) # example with mtcars dataset
split_data2 <- function(data, window.size) {
  lapply(0:(nrow(dats) - window.size), 
         function(i) dats[(1 + i):(window.size + i), , drop = F])
}

split_data2(dats, 2)