首页 > 解决方案 > 为组中的每个行组合创建一个新数据集

问题描述

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

   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但似乎无法得到我想要的结果。从概念上讲,这对我来说似乎并没有太大的挑战性,所以我不确定我错过了什么。

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

标签: rdataframecombinations

解决方案


有很多方法可以解决这个问题。一个简单的解决方案是只生成所有 4 行组合,然后将其子集到具有所有不同Group值的组合。我为您的数据命名df并假设Name将是唯一的行 ID。如果这不是真的,你可以df$Name1: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

推荐阅读