【问题标题】:R: split elements of a list into sublistsR:将列表的元素拆分为子列表
【发布时间】:2012-09-14 08:47:11
【问题描述】:

我有一个具有以下结构的数据框:

pat <- c(rep(1,50), rep(2,50), rep(3,50))
inc <- rep(c(rep(1,5), rep(2,5), rep(3,5), rep(4,5), rep(5,5),
             rep(6,5), rep(7,5), rep(8,5), rep(9,5), rep(10,5)), 3)
df <- data.frame(cbind(pat, inc))

df 被拆分成一个元素列表:

all.inc = split(df, inc)

现在我想将此列表的每个元素拆分为子列表。比如:

all.pat = split(all.inc, pat)

这显然行不通。我已经尝试过plyrlapply 功能,但没有成功。

有什么想法吗?

【问题讨论】:

  • 但是您实际上想要达到什么目的? dplyr::group_by 允许您通过一个或多个变量进行任意拆分,然后将其传递到任意一组 mutate 和/或 summarize,然后是 %&gt;% ungroup

标签: r list


【解决方案1】:

使用lapply:

lapply(all.inc, function(x) split(x, x$pat))

【讨论】:

  • 好的,它有效。结果,我得到了一个与 all.inc 长度相同(10)的列表。但是我想让例如 all.pat[1] 中的每个元素成为单个列表元素。 all.pat[1] 的长度为 1,但它的长度应该是 3。在这种情况下,整个列表的长度应该是 30。希望,这很清楚吗?!
  • @Markus,那是因为列表是嵌套的。索引子列表需要:length(all.pat[[1]])
  • 好的,没问题。刚刚找到“取消列表”功能。使用 recursive = F 选项,它可以提供所需的结果。非常感谢!
  • @Markus,如果是这种情况,请注意 Ben Barnes 的解决方案可以让您直接到达那里(尽管 data.frames 的顺序不同)。
  • 我需要两个列表(all.pat 和 all.inc)进行进一步处理。所以我想我会使用你的解决方案。
【解决方案2】:

如果您想一次性拆分所有数据框,可以使用

split(df, interaction(df$pat,df$inc))

但是,返回的值将是单个数据帧列表,这与拆分列表元素得到的结果略有不同。

【讨论】:

  • 在这里使用interactionlistsplit(df, list(df$...))有什么区别?我实际上比 OP 更喜欢这个,因为我发现处理嵌套列表有时会很麻烦。 +1。
  • @mrdwab,显然没有区别(除非identical 对我撒谎)。 split.defaultf 上调用interaction,如果f 是一个列表,那么我想我会删掉这一步。如果 OP 在第一次拆分后执行计算,然后再次拆分,那么我的解决方案将无济于事。 +1 给你!
  • @RomanLuštrik,我检查过,但没有。它还创建(在本例中)30 个数据帧的单个列表。我只是想知道一种方法是否比另一种更强烈推荐——我一直使用list 方法。
  • (我删除了我的评论,因为我意识到这是错误的 - 我在想tapply-ish。
  • 我今天回答一个问题后遇到了这个答案。这很有帮助。感谢您分享这个。 +1 :)
猜你喜欢
  • 2015-05-19
  • 1970-01-01
  • 2019-09-18
  • 2017-07-30
  • 1970-01-01
  • 2020-12-29
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多