Создание нового набора данных для каждой комбинации строк в группах - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь создать набор данных для каждой комбинации строк из отдельных групп. В идеале должна быть выбрана одна строка из каждой группы, и для каждой комбинации должен быть набор данных. У меня есть набор данных, который выглядит похожим по структуре с примером ниже:

   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, но не могу получить желаемый результат. Концептуально это не кажется мне слишком сложным, поэтому я не уверен, что мне не хватает.

Любая помощь будет принята с благодарностью! Заранее спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Множество способов подойти к этому. Простое решение состоит в том, чтобы просто сгенерировать все 4 комбинации строк, а затем подгруппировать их со всеми различными значениями Group. Я назвал ваши данные df и предположил, что Name будет уникальным идентификатором строки. Если это не так, вы можете заменить 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
...