为每组中的行的组合创建一个新的数据集。

问题描述 投票:1回答:1

我试图为来自不同组的行的每个组合创建一个数据集。理想的情况是,从每组中选择一行,然后为每个组合建立一个数据集。我有一个数据集,其结构类似于下面的示例。

   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个回答
0
投票

有很多方法可以解决这个问题。一个简单的解决方案是只生成所有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
© www.soinside.com 2019 - 2024. All rights reserved.