首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套列表中总结子列表的内容

在嵌套列表中总结子列表的内容
EN

Stack Overflow用户
提问于 2021-03-11 15:56:37
回答 1查看 132关注 0票数 1

我得到了一个嵌套列表,其中每个子列表都包含有关一个特定数据框架的值的信息。该清单的结构如下:

代码语言:javascript
复制
summary <- list(df1 = list(value1 = "phone", count = 11, ratio = 78.57, value2 = "mail", count = 13, ratio = 92.86, value3 = "zoom", count = 8, ratio = 57.14),
df2 = list(value4 = "yes", count = 4, ratio = 28.57, value5 = "no", count = 10, ratio = 71.43))

str(summary)
List of 2
 $ df1:List of 9
  ..$ value1: chr "phone"
  ..$ count : num 11
  ..$ ratio : num 78.6
  ..$ value2: chr "mail"
  ..$ count : num 13
  ..$ ratio : num 92.9
  ..$ value3: chr "zoom"
  ..$ count : num 8
  ..$ ratio : num 57.1
 $ df2:List of 6
  ..$ value4: chr "yes"
  ..$ count : num 4
  ..$ ratio : num 28.6
  ..$ value5: chr "no"
  ..$ count : num 10
  ..$ ratio : num 71.4

在这里,summary[[1]]指出,在数据帧1中,值“phone”以一定的比例发生了11次,值“mail”发生了13次,等等。同样的情况也适用于数据框架2,其中“是”被计算了四次等等。

现在,我想要创建一个嵌套列表,它总结了每个子列表的值、计数和比率。更准确地说,结果列表的每个子列表应该只包含三个元素值,计数和比率,每个元素包含值、相应的计数和比率。所需的列表结果应该具有以下结构:

代码语言:javascript
复制
result <- list(res_df1 = list(value = c("phone", "mail", "zoom"), count = c(11,13,8), ratio = c(78.57, 92.86, 57.14)),
res_df2 = list(value = c("yes", "no"), count = c(4, 10), ratio = c(28.57, 71.43)))

str(result)
List of 2
 $ res_df1:List of 3
  ..$ value: chr [1:3] "phone" "mail" "zoom"
  ..$ count: num [1:3] 11 13 8
  ..$ ratio: num [1:3] 78.6 92.9 57.1
 $ res_df2:List of 3
  ..$ value: chr [1:2] "yes" "no"
  ..$ count: num [1:2] 4 10
  ..$ ratio: num [1:2] 28.6 71.4

我想出了一个解决方案,它产生了这样的结果,但它更像是一个解决方案,而不是一个很好的R解决方案:

代码语言:javascript
复制
library(rlist)
result <- list()
for(i in 1:length(summary)){
    tmp <- (summary[[i]])
    value <- as.character(tmp[seq(1, length(tmp), 3)])
    count <- as.numeric(tmp[seq(2, length(tmp), 3)])
    ratio <- as.numeric(tmp[seq(3, length(tmp), 3)])
    df <- cbind.data.frame(value, count, ratio)
    result <- list.append(result, df)
}

我无法想出一个工作解决方案,例如,包含lapply方法或类似的方法。有没有一种更好、更紧凑的方法来做到这一点?如有任何建议,敬请谅解!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-11 16:30:02

你试过这样的东西吗?

代码语言:javascript
复制
for (i in 1:3) {
   idx <- seq(i, length(summary[[1]]), 3)
   assign(paste0("new",i), lapply(summary[[1]][idx], "[[", 1) )
 }
data.table::rbindlist(list(new1, new2, new3))

如果您对每个子列表都这样做(也许用max_length而不是3来交换索引i),这是一种更R的方法。我们使用lapply,[,最后使用来自data.table package的非常快的data.table package(我把它放在那里只是为了突出显示它来自这个包)

这给了你:

代码语言:javascript
复制
   value1 value2 value3
1:  phone   mail   zoom
2:     11     13      8
3:  78.57  92.86  57.14

正如您在本文中看到的那样,这种rbindlist方法也具有很强的可伸缩性:

How to rbind many (+1000) *.rds files fast

因为它可以比追加或重新绑定更快地绑定许多文件/列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66586021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档