【问题标题】:R sum observations by unique column PAIRS (B-A and A-B) and NOT unique combinations (B-A or A-B)R 按唯一列 PAIRS(B-A 和 A-B)和非唯一组合(B-A 或 A-B)对观察结果求和
【发布时间】:2020-07-10 03:42:32
【问题描述】:

我有一个看似简单的计算,其中我有一个由 4 列组成的数据框,如下所示(日期、来源、目的地、计数)。我想按日期和 ID1 和 ID2 的唯一对求和计数,这意味着 A-B 和 B-A 是一对。

Date ID1 ID2 Count
12-1   A   B   1
12-1   B   A   1
12-1   D   E   1
12-1   E   D   2
12-1   Y   Z   2
12-2   A   B   1
12-2   B   A   1
12-2   D   E   1
12-2   E   D   2
12-2   Y   Z   2

根据日期集,我们可以通过唯一组合(例如 A-B、B-A、D-E、E-D 等)对“计数”列求和。但是,我想按唯一对对计数列求和,这意味着 A-B 也将包括 B-A。

理想情况下,我希望表格按日期和唯一对进行汇总。

我查看了所有内容,dyplyr 函数如 mutate、gather、unite-all 无济于事。

非常感谢任何见解或指出正确的方向。非常感谢

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    我们可以使用pminpmax 来按行排序,将其与“日期”一起用作分组变量,并获得“计数”的sum

    library(dplyr)
    df1 %>% 
      group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>% 
      summarise(Count = sum(Count)) %>%
      #dplyr::select(ID1 = ID1n, ID2 = ID2n, Date, Count)
      rename(ID1 = ID1n, ID2 = ID2n)
    # A tibble: 6 x 4
    # Groups:   ID1, Date [6]
    #  ID1   ID2   Date  Count
    #  <chr> <chr> <chr> <int>
    #1 A     B     12-1      2
    #2 D     E     12-1      3
    #3 Y     Z     12-1      2
    #4 A     B     12-2      2
    #5 D     E     12-2      3
    #6 Y     Z     12-2      2
    

    或者如果来自dplyrselectrename 有问题,则在summarise 步骤处停止并分配列名

    out <-  df1 %>% 
      group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>% 
      summarise(Count = sum(Count)) 
    names(out)[1:2] <- c("ID1", "ID2")
    

    或使用base Rsort 对列'ID1'、'ID2' 的行,并通过其他变量获得'Count' 的sum

    df1[c('ID1', 'ID2')] <- t(apply(df1[c('ID1', 'ID2')], 1, sort))
    aggregate(Count ~ ., df1, sum)
    #  Date ID1 ID2 Count
    #1 12-1   A   B     2
    #2 12-2   A   B     2
    #3 12-1   D   E     3
    #4 12-2   D   E     3
    #5 12-1   Y   Z     2
    #6 12-2   Y   Z     2
    

    数据

    df1 <- structure(list(Date = c("12-1", "12-1", "12-1", "12-1", "12-1", 
    "12-2", "12-2", "12-2", "12-2", "12-2"), ID1 = c("A", "B", "D", 
    "E", "Y", "A", "B", "D", "E", "Y"), ID2 = c("B", "A", "E", "D", 
    "Z", "B", "A", "E", "D", "Z"), Count = c(1L, 1L, 1L, 2L, 2L, 
    1L, 1L, 1L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2022-10-01
    • 2021-11-28
    • 2017-04-06
    相关资源
    最近更新 更多