【问题标题】:lapply with different indices in list of listslapply 在列表列表中使用不同的索引
【发布时间】:2021-07-02 02:17:02
【问题描述】:

我正在尝试获取列表列表中某个列 ($new_age = numeric values) 的输出。

数据是“my_groups”,由 28 个列表组成。这些列表本身的大小不规则:

92 105 96 86 91 94 73 100 87 89 88 90 112 82 95 83 94 106 91 101 86 81 89 68 89 87 109 73 (len_df)

第一个列表有 92 个列表,第二个列表有 105 个等等......直到第 28 个列表有 73 个列表。

首先,我希望我的函数遍历 28 年的数据,其次,在这些年里,我想遍历 len_df,因为 $new_age 在嵌套列表中。

我尝试的是这样的:

test <- lapply(seq(1:28), function(i) sapply(seq(1:len_df), function(j) (my_groups[[i]][[j]]$new_age) ) )

但是,索引超出了范围,我不确定如何为嵌套列表组合两个不同的索引。 Unlist 并不理想,因为我必须将数据视为单独的组并按年排序。

预期输出:$new_age(数值)为 28 年中的每一年,例如第一个 = 92 个值,第二个 = 105 个值等。

知道如何进行这项工作吗?谢谢!

【问题讨论】:

  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 编辑了帖子。
  • seq(1:28) 是荒谬的。使用seq 使用: 运算符,不要同时使用。此外,1 : len_df 容易出错,应该始终替换为seq_len(len_df)(或seq_along(…)),因为1 : … 对空向量执行错误操作。
  • 一个可重现的例子意味着一个缩减的例子,这样任何人都可以从问题中复制数据并将其粘贴到他们的 R 会话中。这次我在回答末尾的注释中为您提供了一个。
  • @KonradRudolph 感谢您的重要建议!我用 seq_along(len_df) 替换了 seq(1:len_df),因为 seq_len(len_df) 在这种情况下不起作用。此外, lapply 仅循环直到最初放入的最大值。使用索引 i 和 j 时,输出始终是 28 个列表和 28 个值,但不是 28 个列表和 92、105 个值等。

标签: r list loops nested lapply


【解决方案1】:

这里有几种不同的方法:

1) 整体对象方法 假设输入是L,在最后的注释中可重现地显示,并且想要的是length(L) 数字向量的列表,即list(1:2, 3:5) ,由new_age 值组成:

lapply(L, sapply, `[[`, "new_age")

给予:

[[1]]
[1] 1 2

[[2]]
[1] 3 4 5

2) 索引如果您想使用索引来执行此操作,如问题所示的代码中所示,则使用seq_along

ix <- seq_along(L)
lapply(ix, function(i) sapply(seq_along(L[[i]]), function(j) L[[i]][[j]]$new_age))

3) unlist 要使用 unlist,使用 rep 形成适当的分组变量,并由它拆分为单独的向量。这假设 new_age 是唯一的叶子,在您的数据中可能会或可能不会出现这种情况,但在最后注释中的可重现示例中就是这种情况。

split(unname(unlist(L)), rep(seq_along(L), lengths(L)))

注意

L <- list(list(list(new_age = 1), list(new_age = 2)),
  list(list(new_age = 3), list(new_age = 4), list(new_age = 5)))

【讨论】:

  • 感谢您展示不同的方法!非常感激。我注意到第一个和第二个工作与预期一样。但是,当计算例如之后我得到 NAN 的平均值或最大值等。但是,在第二种方法中将“均值”直接放在第二个函数的前面是可行的。至于第三种方法,R 表示“数据长度不是拆分变量的倍数”。
  • 如果 Lout 是答案中三个备选方案中任何一个的输出,则 sapply(Lout, mean) 给出相应的均值。如果数据中有 NA,则 sapply(Lout, mean, na.rm = TRUE) 将排除它们。如果这不是您需要的,您将不得不提供一个可重现的示例,因为我们不知道您拥有什么,因为您没有提供这样的示例。您还阅读了关于第三种选择的警告吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2020-06-09
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多