【问题标题】:Aggregate with respect to condition关于条件的聚合
【发布时间】:2021-11-22 01:05:37
【问题描述】:

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

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(exchange)) 。 但这给了我所有交换的总和(也就是说,它返回一个值)。不是两国交换的总和。

感谢您的帮助,非常感谢!

【问题讨论】:

  • 我尝试了 group_by (ID_1, ID_2) 然后聚合。 ...然后发生了什么?请发布您的代码尝试并转发您遇到的问题,例如错误或不希望的结果。
  • 根据您分享的示例,您的预期输出是什么?
  • 我是否正确地假设您想将 a 到 b 和 b 到 a 的交换相加?等等?
  • 是的德申。我有一个国家对数据集。我有很多国家之间的交流。我想总结国家之间所有商品的所有交换。
  • 我尝试了以下示例:

标签: r sum aggregate


【解决方案1】:

这就是你要找的吗?

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

【讨论】:

  • 几乎我认为但我无法重现它。当我用数据集中的真实 ID 替换“ID”时,new_id 变得非常不清楚。我不知道那是什么。它肯定不是 ID 的合并,并且不对应于数据集中的任何内容。但是,有一个真实的映射,这意味着我快到了。
  • 问题出在最后一条命令(总结...)。在此之前,new_id 是好的:ID1 和 ID2 的联合。但是总结之后,new_id就完全不一样了。
  • 如果它不适用于你的真实数据,那么请分享一个你真实数据的小例子。见stackoverflow.com/help/minimal-reproducible-example
  • 另请参阅我的更新答案。
  • 完美,谢谢!!!
【解决方案2】:

你很亲密:

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() 将为原始数据框中不存在的变量/列生成新列,并使用NA 填充没有值的现有列的​​单元格。
您可以通过重命名此类变量来强制将某些值放入同一列/变量中。

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

【讨论】:

  • 我认为这不是 TO 想要的。相反,他们想总结结果,例如a/b 和 b/a。
  • 完美。还是一个问题。除了数据集之外,我如何得到这个。也就是说,我改变了最后一个变量,以便让我的原始数据集+SUMXchange
  • 在答案中进行了修改,检查你想要什么。您要么需要先重命名 cols,然后再绑定,要么绑定并让交换值与 Sum_Exchange 不同。祝你好运!
猜你喜欢
  • 2022-01-07
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2020-04-21
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多