【问题标题】:Summing or aggregating a column of items based on two columns with similar vectors in R基于R中具有相似向量的两列对一列项目求和或聚合
【发布时间】:2019-04-03 18:39:20
【问题描述】:

我需要在两列中聚合具有相似项目的行。请问有“或”功能吗?我在下面发布了一个示例数据集:

A1 <- data.frame(Animal1= c("A", "A","B","B","D") ,Animal2=c("B","D","D","A","B"),Frequency=c(2,3,1,4,5))
> A1
  Animal1 Animal2 Frequency
1       A       B         2
2       A       D         3
3       B       D         1
4       B       A         4
5       D       B         5

如何聚合,以便我只得到一个值,结合第 3 行和第 5 行的频率,其中第 3 行的 Animal1 为 B,Animal2 为 D,第 5 行的 Animal1 为 D,Animal2 为 B,频率为 6?

【问题讨论】:

  • Hello Joke O. 下面的答案对您的问题有帮助吗?如果没有,您会提供反馈吗?预期的输出是什么?

标签: r dplyr data.table tidyverse


【解决方案1】:

这是一个可能的解决方案。我可能过于复杂了,但它应该会给你想要的结果。我做的第一件事是使字符串不是数据框中的因素。

A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
                 Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 

A1 %>% 
  mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
  group_by(combined) %>% 
  summarise(total = sum(Frequency))

输出

# A tibble: 3 x 2
  combined total
  <chr>    <dbl>
1 AB           6
2 AD           3
3 BD           6

【讨论】:

    【解决方案2】:

    我不确定我是否理解您的问题,但这就是您要找的吗?

    library(dplyr)
    df %>% as_tibble %>% 
      filter((Animal1 == "B" & Animal2 == "D") | (Animal1 == "D" & Animal2 == "B")) %>% 
      summarise(sum_freq = sum(Frequency))
    

    【讨论】:

      【解决方案3】:

      谢谢,伙计们。除了@StephenK 的回答,我还添加了另一个步骤来拆分新的“组合”列。

      A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
                   Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 
      
      A2<- as.data.frame(A1 %>% mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
      group_by(combined) %>% summarise(total = sum(Frequency)))
      
      #create new columns for each letter
      A2$Animal1 <- substr(A2$combined, start = 1, stop = 1)
      A2$Animal2 <- substr(A2$combined, start = 2, stop = 2)
      A2
        combined total Animal1 Animal2
      1       AB     6       A       B
      2       AD     3       A       D
      3       BD     6       B       D
      
      ##Select only columns needed and reorder
      A3 <- A2[,c("Animal1","Animal2", "total")]
      A3
        Animal1 Animal2 total
      1       A       B     6
      2       A       D     3
      3       B       D     6
      

      【讨论】:

        猜你喜欢
        • 2020-10-21
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 2013-10-01
        • 2021-11-28
        • 2021-08-29
        • 2015-05-17
        相关资源
        最近更新 更多