拆分 R 数据框不保留行名
Splitting R dataframe doesn't preserve row names
我正在尝试将数据帧拆分为滚动块,存储在列表中以进行交叉验证。
这是我的代码:
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
我会放置实际的列表输出,但我无法生成它。这应该足以说明列表中每个元素的列表内容。
您需要将模式从 "character" 更改为 "list"。您正在尝试将 data.frames 存储在字符向量中,但为了您的方法,您需要一个列表。
另外,将res[d+1]修改为res[[d+1]]。鉴于 res 现在是一个列表 res[d+1] returns 一个列表,其中 res[[d+1]] returns 包含其中的 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
与评论中所说的类似,这是我这样做的一种方式:
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)
我正在尝试将数据帧拆分为滚动块,存储在列表中以进行交叉验证。
这是我的代码:
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
我会放置实际的列表输出,但我无法生成它。这应该足以说明列表中每个元素的列表内容。
您需要将模式从 "character" 更改为 "list"。您正在尝试将 data.frames 存储在字符向量中,但为了您的方法,您需要一个列表。
另外,将res[d+1]修改为res[[d+1]]。鉴于 res 现在是一个列表 res[d+1] returns 一个列表,其中 res[[d+1]] returns 包含其中的 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
与评论中所说的类似,这是我这样做的一种方式:
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)