【问题标题】:R variable number of string concatenations within group_byR 可变数量的 group_by 中的字符串连接
【发布时间】:2020-06-10 20:37:42
【问题描述】:

假设我有下表的房屋(或任何东西)及其颜色:

我正在尝试:

  1. group_by(组)
  2. 计数行(我假设使用length(unique(ID))
  3. 变异或汇总成一个新行,其中包含组中每种颜色的计数,作为一个字符串。

结果应该是:

所以我知道第 3 步可以通过手动输入每个可能的组合来完成

df <- df %>%
  group_by(Group) %>%
  mutate(
    Summary = case_when(
      all(
        sum(count_green) > 0
        ) ~ paste(length(unique(ID)), " houses, ", count_green, " green")
    )
  )

但是如果我有数百种可能的组合呢?有没有办法粘贴到字符串中并为每种新颜色/计数附加?

【问题讨论】:

    标签: r dplyr grouping


    【解决方案1】:

    这是一种方法,我们用add_count 计算“组”、“颜色”的频率、用“颜色”计算unite,然后按“组”分组,通过连接来创建“摘要”列unique 'nColor' 的元素与频率 (n())

    library(dplyr)
    library(tidyr)
    library(stringr)
    df %>%
        add_count(Group, Color) %>%
        unite(nColor, n, Color, sep= ' ',  remove = FALSE) %>%
        group_by(Group) %>% 
        mutate(
            Summary = str_c(n(), ' houses, ', toString(unique(nColor))))  %>%
        select(-nColor) 
    # Groups:   Group [2]
    #     ID Group Color      n Summary                    
    #  <int> <chr> <chr>  <int> <chr>                      
    #1     1 a     Green      2 3 houses, 2 Green, 1 Orange
    #2     2 a     Green      2 3 houses, 2 Green, 1 Orange
    #3     3 a     Orange     1 3 houses, 2 Green, 1 Orange
    #4     4 b     Blue       2 3 houses, 2 Blue, 1 Yellow 
    #5     5 b     Yellow     1 3 houses, 2 Blue, 1 Yellow 
    #6     6 b     Blue       2 3 houses, 2 Blue, 1 Yellow 
    

    数据

    df <- structure(list(ID = 1:6, Group = c("a", "a", "a", "b", "b", "b"
    ), Color = c("Green", "Green", "Orange", "Blue", "Yellow", "Blue"
    )), class = "data.frame", row.names = c(NA, -6L))
    

    【讨论】:

      【解决方案2】:

      这是purrr 中的map_chr 和大量粘贴的方法。

      library(dplyr)
      library(purrr)
      df %>%
        group_by(Group) %>%
        mutate(Summary = paste(n(),"houses,",
                                paste(map_chr(unique(as.character(Color)),
                                              ~paste(sum(Color == .x),.x)),
                                      collapse = ", ")))
      
      ## A tibble: 6 x 4
      ## Groups:   Group [2]
      #     ID Group Color  Summary                    
      #  <int> <fct> <fct>  <chr>                      
      #1     1 a     Green  3 houses, 2 Green, 1 Orange
      #2     2 a     Green  3 houses, 2 Green, 1 Orange
      #3     3 a     Orange 3 houses, 2 Green, 1 Orange
      #4     4 b     Blue   3 houses, 2 Blue, 1 Yellow 
      #5     5 b     Yellow 3 houses, 2 Blue, 1 Yellow 
      #6     6 b     Blue   3 houses, 2 Blue, 1 Yellow 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多