gpt4 book ai didi

r - 如何将 DataFrame 转换为嵌套列表

转载 作者:行者123 更新时间:2023-12-04 21:06:50 25 4
gpt4 key购买 nike

提供以下结构 data.frame()var1.gendervar1.score.rawvar1.score.raw.lowervar1.score.raw.upper[...]var2.gendervar2.score.rawvar2.score.raw.lowervar2.score.raw.upper[...]
我如何将其转换为多维列表,按 . 拆分?

样本数据:
df <- data.frame('var1.gender' = c(1,1,3,3), 'var1.score.raw' = c(12.3, 12.4, 14.5, 13.2), 'var1.score.raw.lower' = c(11,11,13,12), 'var1.score.raw.upper' = c(13,13,15,14), 'var2.gender' = c(1,1,3,3), 'var2.score.raw' = c(12.3, 12.4, 14.5, 13.2), 'var2.score.raw.lower' = c(11,11,13,12), 'var2.score.raw.upper' = c(13,13,15,14))
结果列表应如下所示:

$var1
$var1$gender
[1] 1 1 3 3

$var1$score
$var1$score$raw
[1] 12.3 12.4 14.5 13.2

$var1$score$lower
[1] 11 11 13 12

$var1$score$upper
[1] 13 13 15 14



$var2
$var2$gender
[1] 1 1 3 3

$var2$score
$var2$score$raw
[1] 12.3 12.4 14.5 13.2

$var2$score$lower
[1] 11 11 13 12

$var2$score$upper
[1] 13 13 15 14

最佳答案

顺便说一下,“df”的结构是构建通缉名单的一种直接方法是评估像 list[["X"]][["Y"]][["Z"]][...] = df$X.Y.Z... 这样的调用。对于“df”的每一列。这可以通过操作“语言”对象来动态完成。

定义一个接受列表、名称/索引的字符向量和在该级别分配的值的函数,我们有:

assign_list_element = function(x, inds, val)
{
cl = bquote(x[[.(inds[1])]])
for(s in inds[-1]) cl = bquote(.(cl)[[.(s)]])

cl = call("<-", cl, bquote(.(val)))
print(cl); flush.console()

eval(cl)

return(x)
}

一些 bquote调用可以更简单或替换为 substitute ,但是,像上面一样使用它可以构造一个关于索引的更好格式化的调用(用于打印目的)。

然后,对于“df”的每一列,重新构建一个 -at start empty- 列表:
nms = strsplit(names(df), ".", TRUE)
l = list()
for(i in seq_along(nms)) l = assign_list_element(l, nms[[i]], df[[i]])
#x[["var1"]][["gender"]] <- c(1, 1, 3, 3)
#x[["var1"]][["score"]][["raw"]] <- c(12.3, 12.4, 14.5, 13.2)
#x[["var1"]][["score"]][["lower"]] <- c(11, 11, 13, 12)
#x[["var1"]][["score"]][["upper"]] <- c(13, 13, 15, 14)
#x[["var2"]][["gender"]] <- c(1, 1, 3, 3)
#x[["var2"]][["score"]][["raw"]] <- c(12.3, 12.4, 14.5, 13.2)
#x[["var2"]][["score"]][["lower"]] <- c(11, 11, 13, 12)
#x[["var2"]][["score"]][["upper"]] <- c(13, 13, 15, 14)

str(l)
#List of 2
# $ var1:List of 2
# ..$ gender: num [1:4] 1 1 3 3
# ..$ score :List of 3
# .. ..$ raw : num [1:4] 12.3 12.4 14.5 13.2
# .. ..$ lower: num [1:4] 11 11 13 12
# .. ..$ upper: num [1:4] 13 13 15 14
# $ var2:List of 2
# ..$ gender: num [1:4] 1 1 3 3
# ..$ score :List of 3
# .. ..$ raw : num [1:4] 12.3 12.4 14.5 13.2
# .. ..$ lower: num [1:4] 11 11 13 12
# .. ..$ upper: num [1:4] 13 13 15 14

使用这种方法,列表在每次迭代时都会重新构建,但它的元素不会被复制。

关于r - 如何将 DataFrame 转换为嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43661154/

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