首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与条件有关的合计

与条件有关的合计
EN

Stack Overflow用户
提问于 2021-11-21 15:56:32
回答 2查看 162关注 0票数 0

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

代码语言:javascript
复制
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

我们有不同身份的多个国家之间的交流。我想总结一下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) %>%汇总(dataset2,sum_of_exchange=sum(exchange))。但是这给出了所有交换的和(也就是说,它返回一个值)。而不是两国之间交流的总和。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-21 16:32:34

这就是你要找的吗?

代码语言:javascript
复制
df %>%
  rowwise() %>%
  mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
  group_by(new_id) %>%
  summarize(exchange = sum(exchange))

这意味着:

代码语言:javascript
复制
# 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似乎希望将该总和附加到原始数据中,这些数据可以通过以下方式完成:

代码语言:javascript
复制
df %>%
  rowwise() %>%
  mutate(new_id = paste0(str_sort(c(ID_1, ID_2)), collapse = '-')) %>%
  group_by(new_id) %>%
  mutate(sum_exchange = sum(exchange)) %>%
  ungroup()

这意味着:

代码语言:javascript
复制
# 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
票数 0
EN

Stack Overflow用户

发布于 2021-11-21 16:24:11

你们很亲密:

代码语言:javascript
复制
library(dplyr)

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

这产生了:

代码语言:javascript
复制
# 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。

代码语言:javascript
复制
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变量,请重命名该列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70056141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档