Одна dplyr
возможность может быть:
df %>%
mutate_if(is.factor, as.character) %>%
group_by(grp = paste(pmin(col_a, col_b), pmax(col_a, col_b), sep = "_")) %>%
summarise(val = sum(val))
grp val
<chr> <dbl>
1 A_B 4
2 A_C 7
Или с tidyverse
, используя аналогичную идею как @Sonny:
df %>%
mutate_if(is.factor, as.character) %>%
nest(col_a, col_b) %>%
group_by(grp = unlist(map(data, function(x) paste(sort(x), collapse = "_")))) %>%
summarise(val = sum(val))
Если вы хотите также отделитьэто в два столбца (этот шаг также потребует tidyr
):
df %>%
mutate_if(is.factor, as.character) %>%
group_by(grp = paste(pmin(col_a, col_b), pmax(col_a, col_b), sep = "_")) %>%
summarise(val = sum(val)) %>%
separate(grp, c("new_col_a", "new_col_b"), sep = "_")
new_col_a new_col_b val
<chr> <chr> <dbl>
1 A B 4
2 A C 7
Или в случае второй возможности:
df %>%
mutate_if(is.factor, as.character) %>%
nest(col_a, col_b) %>%
group_by(grp = unlist(map(data, function(x) paste(sort(x), collapse = "_")))) %>%
summarise(val = sum(val)) %>%
separate(grp, c("new_col_a", "new_col_b"), sep = "_")