【问题标题】:How to Split a df into unique groups? [duplicate]如何将 df 拆分为不同的组? [复制]
【发布时间】:2017-06-22 17:31:02
【问题描述】:

我有以下data.frame。查看前几行的示例和 属性。

SubPop      Origin   grid_code
 AL           2008   4.730380
 AL           2008   5.552315
 AL           2008   5.968850
 AL           2008   5.128384
 AL           2009   6.927450
 AL           2009   7.135734
 ALCentral    2008   7.381087
 ALCentral    2008   6.232927
 ALCentral    2009   6.431800
 ALCentral    2009   6.690246
 ALCentral    2009   6.794144

我想知道如何将此 data.frame 拆分为属性 SubPop 和 Origin 组合的唯一组。例如,整个 data.frame 有一组独特的 48 种 SubPop 和 Origin 组合。

也就是说,我希望有 48 个列表作为我的最终输出,并且每个列表将只有该组的属性。 示例:第一组“AL 和 2008”将包含我的数据框的所有条目,这些条目具有 SubPop=Al 和 Origin=2008。等等……

> unique<-unique(df[,c("SubPop", "Origin")])
> unique<-unique[order(unique$SubPop, unique$OriginT),]
> df_split<-split(df, unique)

使用此代码,我可以找到属性的唯一组合,但拆分过程已将属性随机分配给组。

如果让您感到困惑,请见谅...

【问题讨论】:

  • 最简单的方法可能是myList &lt;- split(df, interaction(df$SubPop, df$Origin)),它将返回一个由这两个变量的交互作用拆分的data.frames的命名列表。
  • 我不确定将同构数据结构拆分为小块数据并单独处理是否是个好主意。假设您是一名数据库管理员,您会因为两个属性发生变化而创建 48 个单独命名的表吗?

标签: r list dataframe split unique


【解决方案1】:

有很多方法可以做到这一点。这里有两个:

xy <- read.table(text = "SubPop      Origin   grid_code
 AL           2008   4.730380
                 AL           2008   5.552315
                 AL           2008   5.968850
                 AL           2008   5.128384
                 AL           2009   6.927450
                 AL           2009   7.135734
                 ALCentral    2008   7.381087
                 ALCentral    2008   6.232927
                 ALCentral    2009   6.431800
                 ALCentral    2009   6.690246
                 ALCentral    2009   6.794144", header = TRUE)

by(data = xy, INDICES = list(xy$SubPop, xy$Origin), FUN = function(x) x)

library(dplyr)

xy %>%
  group_by(SubPop, Origin)

【讨论】:

    【解决方案2】:
    mylist <- split(df, interaction(df$SubPop,df$Origin))
    indicator <- seq_len(length(mylist))
    eval(parse(text = paste("L" , indicator , "<- ", "mylist[[", indicator, "]]", sep= "" )))
    
    > L1
      SubPop Origin grid_code
    1     AL   2008  4.730380
    2     AL   2008  5.552315
    3     AL   2008  5.968850
    4     AL   2008  5.128384
    > L2
         SubPop Origin grid_code
    7 ALCentral   2008  7.381087
    8 ALCentral   2008  6.232927
    > L3
      SubPop Origin grid_code
    5     AL   2009  6.927450
    6     AL   2009  7.135734
    > L4
          SubPop Origin grid_code
    9  ALCentral   2009  6.431800
    10 ALCentral   2009  6.690246
    11 ALCentral   2009  6.794144
    

    【讨论】:

    • 这个答案已经发布在 cmets 中。你的帖子增加了什么价值?
    • 抱歉我没有看到发表的评论
    • 现在我添加了一些价值 :) 您可以为每个部分创建一个列表
    • 对于它的价值,我通常更喜欢在这些情况下使用 data.frames 列表,因为我可以使用lapply 或其他函数以有组织的方式处理它们。 gregor 对 this post 的回答提供了一些支持使用 data.frames 列表的观点。
    • 非常感谢。这个帖子真的很有帮助。
    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 2013-10-29
    • 1970-01-01
    • 2014-07-31
    • 2016-04-22
    相关资源
    最近更新 更多