【问题标题】:Count sum of value for each element in coma separated column in R计算R中逗号分隔列中每个元素的值总和
【发布时间】:2022-01-17 22:53:36
【问题描述】:

我有一个数据框,例如:

VALUE Names 
1     Sp1,Sp2
1     Sp2
2     Sp3,Sp4
4     Sp2,Sp1

我想以逗号分隔的方式计算每个df$Namesdf$VALUE 的总和,并得到一个新的数据框,例如:

Name Sum
Sp1   5
Sp2   6
Sp3   2
Sp4   2  

如果有帮助,这里是 dput 格式的数据框:

structure(list(VALUE = c(1L, 1L, 2L, 4L), Names = c("Sp1,Sp2", 
"Sp2", "Sp3,Sp4", "Sp2,Sp1")), class = "data.frame", row.names = c(NA, 
-4L))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这就是诀窍。

    library(tidyverse)
    
     x = structure(list(VALUE = c(1L, 1L, 2L, 4L), Names = c("Sp1,Sp2", 
                                                    "Sp2", "Sp3,Sp4", "Sp2,Sp1")), class = "data.frame", row.names = c(NA, 
                                                                                                                       -4L))
    
    y = mutate(x, 
           var1 = str_split(Names,  "\\,", simplify = T)[,1],
           var2 = str_split(Names,  "\\,", simplify = T)[,2]) %>%
    pivot_longer(c(var1,var2), names_to = "var", values_to = "Name") %>%
     select(-var, Names) %>%
     filter(Name  != "") %>%
    group_by(Name) %>%
    summarise(Sum = sum(VALUE))
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 解决方案。

      s <- strsplit(as.character(df1$Names), ",")
      s <- do.call(rbind, lapply(seq_along(s), \(i) {
        data.frame(Sum = rep(df1$VALUE[i], length(s[[i]])), Names = s[[i]])
      }))
      aggregate(Sum ~ Names, s, sum)
      #  Names Sum
      #1   Sp1   5
      #2   Sp2   6
      #3   Sp3   2
      #4   Sp4   2
      

      【讨论】:

        【解决方案3】:

        我们可以使用separate_rows来拆分'Names'列,然后通过sum进行分组

        library(dplyr)
        library(tidyr)
        df1 %>% 
          separate_rows(Names) %>%
          group_by(Names) %>% 
          summarise(Sum = sum(VALUE))
        

        -输出

        # A tibble: 4 × 2
          Names   Sum
          <chr> <int>
        1 Sp1       5
        2 Sp2       6
        3 Sp3       2
        4 Sp4       2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多