gpt4 book ai didi

r - split 和 data.table 的问题

转载 作者:行者123 更新时间:2023-12-02 01:30:34 25 4
gpt4 key购买 nike

我有一个data.table,我想拆分成一个列表然后修改。当我在调用 split 后尝试删除列表中其中一个 data.tables 上的列时,我发现了一些奇怪的行为。这是一个 MWE(抛出错误并导致我的 R session 崩溃):

library(data.table)
d = data.table(level = c(1, 1, 2, 2), value = 1:4)
list = split(d, f = d$level)
list[[1]][, level := NULL]
list

我得到:

Error in .shallow(x, cols = cols, retain.key = TRUE) : Internal error: length(names)>0 but <length(dt)

最佳答案

我建议对变量使用l 名称而不是list
这似乎是过程中使用的 split.data.frame 方法引起的错误。
我最近提出了一种新的 split.data.table 方法,定义如下。它似乎解决了你的问题。

2016-03-30 更新:

split.data.table 已在 data.table 1.9.7 中实现。现在使用可以简单地使用:

library(data.table)
d = data.table(level = c(1, 1, 2, 2), value = 1:4)
l = split(d, by = "level")
l[[1L]][, level := NULL]
l
#$`1`
# value
#1: 1
#2: 2
#
#$`2`
# level value
#1: 2 3
#2: 2 4

下面的旧答案,如果你坚持使用 1.9.6 或更低版本,它可能会有用。请注意,它不会像 split.data.frame 那样处理因子级别,data.table 1.9.7 中开发的方法不是这种情况,它与 data.frame 一致方法。

library(data.table)
split.data.table = function(x, f, drop = FALSE, by, flatten = FALSE, ...){
if(missing(by) && !missing(f)) by = f
stopifnot(!missing(by), is.character(by), is.logical(drop), is.logical(flatten), !".ll" %in% names(x), by %in% names(x))
if(!flatten){
.by = by[1L]
tmp = x[, list(.ll=list(.SD)), by = .by, .SDcols = if(drop) setdiff(names(x), .by) else names(x)]
setattr(ll <- tmp$.ll, "names", tmp[[.by]])
if(length(by) > 1L) return(lapply(ll, split.data.table, drop = drop, by = by[-1L])) else return(ll)
} else {
tmp = x[, list(.ll=list(.SD)), by=by, .SDcols = if(drop) setdiff(names(x), by) else names(x)]
setattr(ll <- tmp$.ll, 'names', tmp[, .(nm = paste(.SD, collapse = ".")), by = by, .SDcols = by]$nm)
return(ll)
}
}
d = data.table(level = c(1, 1, 2, 2), value = 1:4)
l = split.data.table(d, by = "level")
# below setattr to be addressed in split.data.table
invisible(lapply(l, setattr, ".data.table.locked", NULL))
l[[1]][, level := NULL]
l
#$`1`
# value
#1: 1
#2: 2
#
#$`2`
# level value
#1: 2 3
#2: 2 4

我还填写了一份错误报告来描述您的案例,您可以在 data.table#1481 中找到它.

关于r - split 和 data.table 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34512440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com