Как уменьшить фрейм данных до суммы различных комбинаций

У меня есть следующий тип данных (пары стран + их

set.seed(123)
data.frame(V1=c(rep('a',2), rep('b',2), rep('c',2)), V2=c('b', 'c', 'a', 'c', 'a', 'b'), V3=round(runif(6), 2))
  V1 V2   V3
  a  b    0.29
  a  c    0.79
  b  a    0.41
  b  c    0.88
  c  a    0.94
  c  b    0.05

Я хотел бы суммировать последний столбец для парных комбинаций, чтобы у меня был следующий результат

combn(letters[1:3], 2) %>% t %>% as.data.frame() %>% cbind(V3=c(0.7, 1.73, 0.93))
  V1 V2   V3
  a  b    0.70
  a  c    1.73
  b  c    0.93

Я полагаю, что было бы легко, если бы я преобразовал первый фрейм данных в хорошую матрицу, но я не уверен, как это сделать.

2 ответа

  1. Используйте pminand pmaxдля сортировки столбцов V1+ V2по строкам, затем выполните статистическую обработку:

    with(df, aggregate(V3, list(V1=pmin(V1, V2), V2 = pmax(V1, V2)), sum))
    
    #  V1 V2    x
    #1  a  b 0.70
    #2  a  c 1.73
    #3  b  c 0.93
    

    Примечание: Для тогоpmin, pmaxчтобы работать, V1и V2должен быть символьные векторы вместо фактора, вот данные, которые я использую:

    set.seed(123)
    df = data.frame(V1=c(rep('a',2), rep('b',2), rep('c',2)), 
                    V2=c('b', 'c', 'a', 'c', 'a', 'b'), 
                    V3=round(runif(6), 2), stringsAsFactors = F)
    
  2. Мы можем использовать dplyr

    library(dplyr)
    df %>% 
       group_by(g1 = pmin(V1, V2), g2 = pmax(V1, V2)) %>% 
       summarise(V3 = sum(V3))
    #      g1    g2    V3
    #   <chr> <chr> <dbl>
    #1     a     b  0.70
    #2     a     c  1.73
    #3     b     c  0.93