【问题标题】:R - lapply on deep nested elements of listR - 应用于列表的深层嵌套元素
【发布时间】:2018-06-18 17:49:57
【问题描述】:

我有一个存储测量值的大列表(其他 lapply() 运行的产品)。我现在想收集这些测量值并计算中位数/平均值/标准差等,但我不知道如何访问它们。这个列表的结构是这样的:

foo[[i]][[j]][[k]][[1]]
foo[[i]][[j]][[k]][[2]]$bar

我想不出一个会返回的函数,例如$bar 的平均值(但不是 $x 的平均值)并保持索引 i、j、k 的值的关系。

可以使用以下 R 代码生成示例列表:

library(purrr)

metrics <- function(y){

tt10r <- median(y)
list(y, flatten(list(bar = tt10r)))
}


example_list <- list()
for (i in 1:10)
{
  v <- list()
  for (j in 1:10)
  {
    w <- 1:10
    v[j] <- list(w)  
  }
example_list[[i]] <- v
}

foo <- list()
for (i in 1:length(example_list))
{
  u <- list()  
  values <- list()
  for (j in 1:length(example_list[[i]]))
  {
    u[[j]] <- lapply(example_list[[i]][[j]], function(x) mean(x))
    values[[j]] <- lapply(u[[j]], function(x) metrics(x))
  }
foo[[i]] <- values  
}

【问题讨论】:

  • 您能否提供一个可以证明此问题的列表的小样本?
  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 我添加了一些代码来生成这样的列表。我的原始数据是 4GB,因此有点太大而无法呈现。
  • 所需的输出将是一个数据框,其中包含 i、j、k 的列以及每个 i 和 j 组合的所有 k 的平均值。

标签: r list lapply


【解决方案1】:

以下代码运行良好,但我不确定它是否有效(循环!)。给出预期的结果:

final <- matrix(nrow = tail(cumsum(unlist(lapply(foo, function(x) lengths(x) -2))), n=1), ncol = 3) 
final <- data.frame(final)
j=1
i=1

all_js <- c(0, cumsum(lengths(foo)))

starts <- c(0, cumsum(unlist(lapply(foo, function(x) lengths(x) -2)))) + 1
ends <- c(0, cumsum(unlist(lapply(foo, function(x) lengths(x) -2))))

for (i in 1:length(foo))
{
  a <- foo[[i]]

  for (j in 1:length(a))
  {
    b <- a[[j]]

    data <- unlist(lapply(lapply(b[1], '[', 2), '[[', 1))

    for (k in 2:c(length(b)-2))
    {
      data <- rbind(data,unlist(lapply(lapply(b[k], '[', 2), '[[', 1)))
    }    
    row.names(data) <- NULL
    colnames(final) <- c("i", "j", colnames(data))

    first <- starts[all_js[i] + j]
    last <-  ends[all_js[i] + j+1]

    final[first:last,] <- data.frame(cbind(i = i, j = j, data))
  }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2018-08-21
    • 2022-01-18
    • 1970-01-01
    • 2011-02-22
    • 2019-12-03
    相关资源
    最近更新 更多