Есть ли способ сгруппировать по двум переменным, которые обмениваются в R - PullRequest
3 голосов
/ 12 марта 2020

Скажем, у меня есть:

df<-data.frame(ID=c(102, 102, 167,143,143,148,148 ),
               ID2=c(167, 167, 102,148,148,143,143 ),
               group=c(1,1,1,2,2,2,2))


   ID ID2 group
1 102 167     1
2 102 167     1
3 167 102     1
4 143 148     2
5 143 148     2
6 148 143     2
7 148 143     2

обычно я могу использовать add_group_indices для группировки по ID и ID2, но в этом случае я хочу группировать по значениям внутри них (т.е. 102 всегда присоединяется к 167 и наоборот наоборот), то же самое с 143 и 148. Я хочу идентифицировать эти группировки по этой group переменной.

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Вот альтернативное dplyr / purrr решение

df %>%
    mutate(group = as.integer(factor(map2_chr(
        ID, ID2, ~paste(sort(c(.x, .y)), collapse = "_")))))
#   ID ID2 group
#1 102 167     1
#2 102 167     1
#3 167 102     1
#4 143 148     2
#5 143 148     2
#6 148 143     2
#7 148 143     2

Объяснение: Мы используем map2_chr до l oop через столбцы ID и ID2, сортируем и объединяем записи создать уникальный ключ; преобразование в factor в integer затем дает индекс группы.

1 голос
/ 13 марта 2020

Вот базовое решение R

df$group <- as.numeric(factor(apply(df, 1, function(v) toString(sort(v)))))

такое, что

> df
   ID ID2 group
1 102 167     1
2 102 167     1
3 167 102     1
4 143 148     2
5 143 148     2
6 148 143     2
7 148 143     2
1 голос
/ 12 марта 2020

Мы можем создать две новые переменные на основе pmin/pmax, чтобы получить group_indices

library(dplyr)
df %>% 
  mutate(ID_new = pmin(ID, ID2), ID2_new = pmax(ID, ID2)) %>% 
  mutate(group = group_indices(., ID_new, ID2_new)) %>%
  select(-ends_with('new'))
#    ID ID2 group
#1 102 167     1
#2 102 167     1
#3 167 102     1
#4 143 148     2
#5 143 148     2
#6 148 143     2
#7 148 143     2

В devel версии dplyr мы можем использовать cur_group_id после создание группы

library(stringr)
df %>%
    group_by(grp = str_c(pmin(ID, ID2), pmax(ID, ID2))) %>% 
    mutate(group = cur_group_id()) %>%
    ungroup %>% 
    select(-grp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...