this 问题的答案可能适用于您的示例:
library(data.table)
f <- list(c(1,2,3,4),c(1,0,0,0,1),matrix(1:12,3,4),matrix(1:12,4,3))
dt <- data.table::melt(f)
setcolorder(setcolorder(dt, sort(colnames(dt))), "value")
从f 采样值与采样dt$value 相同。如果对行i进行采样,则可以从f中检索到相应的值:
i <- sample(nrow(dt), 1)
ifelse(is.na(dt$Var1[i]), f[[dt$L1[i]]], f[[dt$L1[i]]][dt$Var1[i], dt$Var2[i]])
但是,列表结构可能会变得非常复杂。上述解决方案不适用于以下对象,该对象包含嵌套在嵌套列表中的矩阵的 3 维列表数组:
set.seed(94)
f <- list(c(1:4), c(1, 0, 0, 0, 1), matrix(1:12, 3, 4), list(matrix(1:12, 4, 3), `dim<-`(lapply(1:18, function(i) matrix(sample(1:10, 4), nrow = 2)), c(3,3,2))))
这是一个递归函数,它将返回一个data.table,其中包含对象中每个值的地址。 i 列中的正值表示列表索引(使用双括号访问),负值表示向量/矩阵/数组索引(使用单括号访问)。请注意,它对矩阵和数组使用一维索引。
library(data.table)
faddress <- function(obj) {
if (is.atomic(obj)) {
return(data.table(i = -seq_along(obj)))
} else {
return(rbindlist(lapply(seq_along(obj), function(i) cbind(i, faddress(obj[[i]]))), fill = TRUE))
}
}
使用cbind 将值附加到生成的data.table:
dt <- cbind(unlist(f), faddress(f))
例如dt的第94行是:
> dt[94]
V1 i1 i2 i3 i4
1: 1 4 2 16 -1
1 的值通过以下方式检索:
> f[[4]][[2]][[16]][1]
[1] 1