【问题标题】:How to reduce data frame to sum of distinct combinations如何将数据框减少为不同组合的总和
【发布时间】:2016-12-28 03:20:10
【问题描述】:

我有以下类型的数据(国家对 + 他们的

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

我想如果我将第一个数据帧转换成一个漂亮的矩阵会很容易,但我不确定如何做到这一点。

【问题讨论】:

标签: r combinations


【解决方案1】:

使用pminpmax按行对列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

注意:为了使pminpmax 工作,V1V2 必须是字符向量而不是因子,这是我使用的数据:

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
    

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 2015-06-19
      • 1970-01-01
      • 2022-07-06
      • 2017-03-25
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多