вернуть идентификаторы уникальных комбинаций - PullRequest
6 голосов
/ 29 октября 2019

Моя таблица данных имеет следующий формат

ID   Var1   Var2   Var3   ...
1_1  0      0      1      ...
1_2  1      1      0      ...
1_3  0      0      1      ...
...  ...    ...    ...    ...

Я хочу извлечь идентификаторы из уникальных комбинаций (Var столбцы). Получение уникальных комбинаций не является проблемой (plyr::count(), aggregate() и т. Д.), Я хочу извлечь переменные id, способствующие этим уникальным комбинациям.

Вывод должен выглядеть примерно так:

Var1   Var2   Var3   IDs
0      0      1      1_1, 1_3
1      1      0      1_2

, где столбец IDs представляет собой вектор / список всех идентификаторов, вносящих вклад в уникальную комбинацию.

Я пробовал R пакет и dplyr конвейеры, пока ничего не получалось.

Любые предложения или даже пакеты R, как справиться с этой задачей?

Спасибо!

Ответы [ 3 ]

11 голосов
/ 29 октября 2019

Вы можете использовать group_by_at с шаблоном, который соответствует вашим именам столбцов, и суммировать, то есть

df %>% 
 group_by_at(vars(contains('Var'))) %>% 
 summarise(IDs = toString(ID))

, который дает,

# A tibble: 2 x 4
# Groups:   Var1, Var2 [2]
   Var1  Var2  Var3 IDs     
  <int> <int> <int> <chr>   
1     0     0     1 1_1, 1_3
2     1     1     0 1_2     
5 голосов
/ 29 октября 2019
df %>% group_by_at(.vars=-1) %>% summarize(IDs=list(ID))

Аналогично решению Sotos, но упрощает выбор столбца ID, предполагая, что все остальные столбцы должны быть уникальными, а столбец ID будет столбцом списков, а не строкой.

# A tibble: 2 x 4
# Groups:   Var1, Var2 [2]
   Var1  Var2  Var3 IDs      
  <int> <int> <int> <list>   
1     0     0     1 <chr [2]>
2     1     1     0 <chr [1]>

Просто для удовольствия, вы можете еще больше упростить его, используя функцию tidyr nest:

require(tidyr)
nest(df,IDs=ID)
# A tibble: 2 x 4
   Var1  Var2  Var3 IDs                
  <int> <int> <int> <S3: vctrs_list_of>
1     0     0     1 1_1, 1_3           
2     1     1     0 1_2   

Это по-прежнему оставляет идентификаторы в виде списка, который может или не может быть полезным для вас, но отображает это более четко в таблице. Дополнительным преимуществом сохранения столбца в виде списка, а не строки, является то, что вы можете легко воссоздать исходную таблицу, используя unnest:

unnest(nest(dd,IDs=ID),cols=IDs)
# A tibble: 3 x 4
   Var1  Var2  Var3 ID   
  <int> <int> <int> <chr>
1     0     0     1 1_1  
2     0     0     1 1_3  
3     1     1     0 1_2  
1 голос
/ 29 октября 2019

Использование совокупного и уникального

aggregate(dat$ID,list(dat$Var1,dat$Var2,dat$Var3),unique)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...