如何从data.table
返回list
?问题是,每当我在 j
部分返回 list
时,它就会按设计转换为 data.table
格式?
假设我想返回一个 list
,其元素名为(!)长度为 1 的向量,即:
expected_result <- list(A = c(a = 1), B = c(b = 2), C = c(c = 3))
这确实有效,但是用两个列表来提取第一个元素感觉有点黑客。
那么规范的方式是什么?
library(data.table)
library(magrittr)
d <- data.table(id = LETTERS[1:3],
nm = letters[1:3],
val = 1:3)
d[, .(.(setNames(val, nm) %>%
split(seq_along(.)) %>%
setNames(id)))]$V1[[1]] %>%
all.equal(expected_result)
# [1] TRUE
编辑
@akrun 提供了一个很好的非 data.table
解决方案,但我宁愿找到一个使用 [.data.table
语法的解决方案。
最佳答案
最简单的方法是使用 with
。 分割
使用“id”创建的命名向量(带有“val”和“nm”列)
with(d, split(setNames(val, nm), id))
-输出
#$A
#a
#1
#$B
#b
#2
#$C
#c
#3
或者,如果我们想在 data.table
中创建 list
,它有点复杂,如 data.table
/data.frame
列是长度相等的 list
元素。因此,我们可能需要unclass
属性或将其包装在嵌套的list
中,然后展平
list
元素
do.call(c, d[, .(list(split(setNames(val, nm), id)))]$V1)
#$A
#a
#1
#$B
#b
#2
#$C
#c
#3
关于从 data.table 返回一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65722520/