【问题标题】:Creating a new dataset for each combination of rows in groups为组中的每个行组合创建一个新数据集
【发布时间】:2020-04-29 16:13:33
【问题描述】:

我正在尝试为来自不同组的每个行组合创建一个数据集。理想情况下,将从每组中选择一行,并且每个组合都有一个数据集。我有一个数据集,其结构与以下示例相似:

   Name  Group  Stat1  Stat2
1     1      a     63     38
2     2      a     33     62
3     3      b      3     66
4     4      b     57     67
5     5      c     42     69
6     6      c     47     14
7     7      c     16     10
8     8      d     21     46
9     9      d     72      1

尝试让第一个数据集的最终结果如下所示:

    Name  Group  Stat1  Stat2
1      1      a     63     38
2      3      b      3     66
3      5      c     42     69
4      8      d     21     46

第二个数据集如下所示:

    Name  Group  Stat1  Stat2
1      1      a     63     38
2      3      b      3     66
3      5      c     42     69
4      9      d     72      1

直到用尽所有组合。我尝试过使用应用函数和combn 的策略,但似乎无法获得我想要的结果。从概念上讲,这对我来说似乎不太具有挑战性,所以我不确定我错过了什么。

任何帮助将不胜感激!提前致谢!

【问题讨论】:

    标签: r dataframe combinations


    【解决方案1】:

    有很多方法可以解决这个问题。一个简单的解决方案是只生成所有 4 行组合,然后将其子集到具有所有不同 Group 值的组合。我将您的数据命名为 df 并假设 Name 将是唯一的行 ID。如果不是这样,您可以将df$Name 替换为1:nrow(df)

    # All 4 row combos of row ids
    combs <- combn(df$Name, 4)
    
    # Match group labels to row ids
    g <- matrix(df$Group[combs], nrow = 4)
    
    # 4 row combs filtered to all distinct group vals 
    combs <- combs[,apply(g, 2, function(i) all(!duplicated(i)))]
    
    # For each 4 row combo, extract rows from the dataframe 
    final_list <- apply(combs, 2, function(i) df[i,])
    
    final_list[1:3]
    
    [[1]]
      Name Group Stat1 Stat2
    1    1     a    63    38
    3    3     b     3    66
    5    5     c    42    69
    8    8     d    21    46
    
    [[2]]
      Name Group Stat1 Stat2
    1    1     a    63    38
    3    3     b     3    66
    5    5     c    42    69
    9    9     d    72     1
    
    [[3]]
      Name Group Stat1 Stat2
    1    1     a    63    38
    3    3     b     3    66
    6    6     c    47    14
    8    8     d    21    46
    

    【讨论】:

    • 这太棒了!非常感谢您的回复!
    • 好帖子@dedemild,请接受答案,这样如果其他人正在寻找类似的解决方案,他们会看到它有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2016-09-14
    • 2012-12-23
    • 2017-01-17
    相关资源
    最近更新 更多