【问题标题】:Splitting R dataframe doesn't preserve row names拆分 R 数据框不会保留行名
【发布时间】:2017-06-03 11:38:01
【问题描述】:

我正在尝试将数据帧拆分为滚动块,存储在列表中,以进行交叉验证。

这是我的代码:

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

如果我查看在 (1) 处注销的内容,我可以清楚地看到行名称在我的数据中。执行切片并将其存储在res[d+1] (2) 后表明关联的数据帧中不再有行名。

行名对我的交叉验证非常重要。无论如何我可以在这里使用它们吗?答案似乎总是将drop=FALSE 添加到切片操作中,但在这里不起作用。

谢谢!

编辑:

要重新创建数据集以尝试此操作:

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)

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

       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

我会放置实际的列表输出,但我无法生成它。这应该足以说明列表中每个元素的列表内容。

【问题讨论】:

  • 请提供起始数据集和所需输出。
  • @Abdou 给出了我想要的输出和示例数据集的最佳指示。此外,我将其编辑为表示行名而不是​​列名。
  • 如果你想避免所有的预分配和循环代码,也可以lapply(1:(nrow(dats)-wind+1), function(x) dats[x:(x+wind-1),,drop=FALSE] )

标签: r slice


【解决方案1】:

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

另外,将res[d+1]修改为res[[d+1]]。鉴于 res 现在是一个列表 res[d+1] 返回一个列表,其中 res[[d+1]] 返回包含在其中的 data.frame。这对差异有一个很好的概述:http://adv-r.had.co.nz/Subsetting.html

这是您修改后的函数和示例:

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

类似于 cmets 中所说的,这是我这样做的一种方式:

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)

【讨论】:

  • 为什么会这样?你能用那个更新你的答案吗?
  • 已更新,希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2021-12-05
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多