gpt4 book ai didi

R 将列表层次结构展平到矩阵或 data.frame

转载 作者:行者123 更新时间:2023-12-04 01:07:22 25 4
gpt4 key购买 nike

我想将列表层次结构(类似于 JSON)展平为矩阵或数据框。假设我创建了以下列表:

a <- list(
b1 = list(
c1 = list(
d1 = data.frame()
),
c2 = data.frame()
),
b2 = data.frame()
)

每个字母是另一个级别或降低层次结构。然后我想要一个函数,例如 listToMatrix(mylist = a, steps = 2) ,生成以下内容:
    [,1] [,2]
[1,] "b1" "c1"
[2,] "b1" "c2"
[3,] "b2" "b2"

观察函数的参数 steps = 2暗示它应该只沿着层次结构向下走 2 步。此外,如果在一个方向上没有足够的可用级别,请参阅 b2 ,那么它应该在矩阵中保留以前的列表名称。

有什么建议? :)

最佳答案

这是一个解决方案。所以在这里读起来很容易,我把代码分成两部分。稍后,您可以轻松地将这两个部分合并为一个函数。

首先,一个使用递归获取所有名称矩阵的函数:

anames <- function(x) {

require(plyr)
if (is.data.frame(x)) return(NA)

y <- do.call(rbind.fill.matrix,
mapply(cbind, names(x), lapply(x, anames),
SIMPLIFY = FALSE))
colnames(y) <- NULL

return(y)
}

anames(a)
# [,1] [,2] [,3] [,4]
# [1,] "b1" "c1" "d1" NA
# [2,] "b1" "c2" NA NA
# [3,] "b2" NA NA NA

然后,应用给定 steps 的函数输入,并填写 NA就像你要求的那样:
listToMatrix <- function(myList, steps = Inf) {

a <- anames(myList)
steps <- min(steps, ncol(a) - 1)
cols.idx <- seq_len(steps)
a <- a[, cols.idx]
for (j in tail(cols.idx, -1))
a[, j] <- ifelse(is.na(a[, j]), a[, j - 1], a[, j])

return(a)
}

listToMatrix(a, 2)
# [,1] [,2]
# [1,] "b1" "c1"
# [2,] "b1" "c2"
# [3,] "b2" "b2"

关于R 将列表层次结构展平到矩阵或 data.frame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768114/

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