【问题标题】:Add together values of unique column combinations in data frame将数据框中唯一列组合的值加在一起
【发布时间】:2022-10-07 17:08:08
【问题描述】:

我有一个看起来像这样的数据框:

  iso_o iso_d     value 
1   ABW   AFG       5  
2   AFG   ABW       100    
3   NDL   ALB       17
4   NDL   ARE       4758   
5   ALB   NDL       13   
6   ABW   ARM       10  

我现在想将 \"iso_o\" 和 \"iso_d\" 列中所有出现的对组合起来,并将它们在 \"value\" 中的值相加。因此,例如,ABW - AFG 对应该只出现一次,值为 105,NDL - ALB 也只出现一次,值为 30。像这样:

  iso_o iso_d     value 
1   ABW   AFG       105  
2   NDL   ALB       30    
3   NDL   ARE       4758   
4   ABW   ARM       10  

关于如何做到这一点的任何想法?

  • aggregate(value ~ iso_o + iso_d, data, sum)?
  • @r.user.05apr 我不认为这就是 OP 所追求的。 OP 希望独立于iso_oiso_d 中的条目顺序进行聚合。因此,ABW - AFGAFG - ABW 的值相加。

标签: r dataframe


【解决方案1】:

您可以group_by rowwise sorted 值 iso_oiso_d

library(dplyr)
df %>% 
  rowwise() %>% 
  mutate(sorted = list(sort(c(iso_o, iso_d)))) %>% 
  group_by(sorted) %>% 
  summarise(across(iso_o:iso_d, first),
            value = sum(value)) %>% 
  select(-sorted)
# A tibble: 4 × 3
  iso_o iso_d value
  <chr> <chr> <int>
1 ABW   AFG     105
2 NDL   ALB      30
3 NDL   ARE    4758
4 ABW   ARM      10

【讨论】:

  • 谢谢!我仍然收到错误消息,但是“选择错误(。,-sorted):未使用的参数(-sorted)。当我删除最后一行时,错误消失了,但代码似乎没有产生正确的结果。
【解决方案2】:

这是一个 tidyverse 方法:

df %>% group_by(iso_o, iso_d) %>% mutate(value = sum(value)) %>% ungroup() %>% distinct()

【讨论】:

  • 这不是 OP 所追求的。 OP 希望独立于iso_oiso_d 中的条目顺序来聚合值。 ABW - AFGAFG - ABW 的值要相加,请参阅 @Mael 的回答。
  • 除非对它们进行排序,否则按两列分组将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多