根据条件聚合

Aggregate with respect to condition

我面临以下问题。 我有一个以这种方式简化的数据集

df <- tibble(ID_1=c("a","a", "a","a", "a", "b", "b", "b", "b"), ID_2 = c("a","b", "c","d", "e", "b", "a", "c", "d"), 
             other= c(1, "bu", 34, 3, 5, 6, "jud", 82, 9), exchange=c(1, 13, 34, 3, 5, 6, 8, 82, 9), 
             goods=c("wood","wood", "wood","wood", "wood", "steel", "steel", "steel", "steel"))
df

我们在具有不同 ID 的多个国家/地区之间进行交易。 我想总结A国和B国之间的所有交换,A国和C国之间等等交换的货物。 也就是说,最后,我想要

ID_1 // ID_2 // Sum_exchangeAB
ID_1 // ID_3 // Sum_exchangeBC
....
ID_n // ID_n // Sumexchangenn

我如何在 Dplyr 中做到这一点?我尝试了 group_by (ID_1, ID_2) 然后聚合。或者总结一下。

我尝试了以下示例:dataset2 %>% group_by(ID_1, ID_2, exchange) %>% summarise(dataset2, sum_of_exchange=sum (交换)) 。 但这给了我所有交换的总和(也就是说,它 returns 一个值)。不是两国之间的交换总和。

感谢您的帮助,不胜感激!!

你很接近:

library(dplyr)

df %>% group_by(ID_1, ID_2) %>% summarise(Sum_Exchange = sum(exchange))

这产生:

# A tibble: 9 x 3
# Groups:   ID_1 [2]
  ID_1  ID_2  Sum_Exchange
  <chr> <chr>       <dbl>
1 a     a               1
2 a     b              13
3 a     c              34
4 a     d               3
5 a     e               5
6 b     a               8
7 b     b               6
8 b     c              82
9 b     d               9

然后您可以删除相同的 ID 以省略 AA、BB。

df %>% 
  group_by(ID_1, ID_2) %>% 
  summarise(Sum_Exchange = sum(exchange)) %>% 
  filter(ID_1 != ID_2)

来自评论的附加组件

将数据帧与 {dplyr}bind_rows(df1, df2) 相结合。
请注意,bind_rows() 将为 variables/columns 生成原始数据框中不存在的新列,并用 NA.
填充没有值的现有列的​​单元格 您可以通过重命名此类变量来强制将某些值设置为相同的 column/variable。

针对您手头的问题。检查你want/need。原始数据框带有 other, goods 个变量。因此,这些不存在于汇总数据框中。执行 bind_rows() 将用 NA 填充这些。要将 Sum_Exchange 放入 exchange 变量中,请重命名该列。

这是你要找的吗?

df %>%
  rowwise() %>%
  mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
  group_by(new_id) %>%
  summarize(exchange = sum(exchange))

给出:

# A tibble: 8 x 2
  new_id exchange
  <chr>     <dbl>
1 a-a           1
2 a-b          21
3 a-c          34
4 a-d           3
5 a-e           5
6 b-b           6
7 b-c          82
8 b-d           9

更新:似乎 TO 想要将总和附加到原始数据,这可以通过以下方式完成:

df %>%
  rowwise() %>%
  mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
  group_by(new_id) %>%
  mutate(sum_exchange = sum(exchange)) %>%
  ungroup()

给出:

# A tibble: 9 x 7
  ID_1  ID_2  other exchange goods new_id sum_exchange
  <chr> <chr> <chr>    <dbl> <chr> <chr>         <dbl>
1 a     a     1            1 wood  a-a               1
2 a     b     bu          13 wood  a-b              21
3 a     c     34          34 wood  a-c              34
4 a     d     3            3 wood  a-d               3
5 a     e     5            5 wood  a-e               5
6 b     b     6            6 steel b-b               6
7 b     a     jud          8 steel a-b              21
8 b     c     82          82 steel b-c              82
9 b     d     9            9 steel b-d               9