【问题标题】:Grep a list of terms, group by and summarise values using dplyr使用 dplyr grep 术语列表、分组和汇总值
【发布时间】:2021-10-24 13:57:53
【问题描述】:

我有一张如下所示的表格:

  ID          term value
1  A cat,dog,snake    10
2  B       cat,eel    50
3  C      fish,eel     3
4  D      fish,dog     6

data.frame(ID = c("A", "B", "C", "D"),
           term = c("cat,dog,snake", "cat,eel", "fish,eel", "fish,dog"),
           value = c(10, 50, 3, 6))

我有一份感兴趣的清单:

dog
fish
eel

我想要做的是 grep 列表中每个项目的每一行并计算平均值(值列)。像这样:

  term mean
1  dog  8.0
2 fish  4.5
3  eel 26.5

每个有'dog' 的实例都会计算meanvalue

这样的事情是行不通的:

df %>% 
  group_by(., grepl(list, term)) %>% 
  summarise(mean = mean(value))

我不想做的是将每个术语分成自己的行,因为某些术语行有 100 个选项。所以我能想到的唯一有效的方法是通过 grep 搜索进行分组。虽然也许我错了……

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    也许是这样的?

    mylist <- c("dog", "fish", "eel")
    pattern <- paste0(mylist, collapse = "|")
    
    
    df %>% 
      separate_rows(term) %>% 
      group_by(term = str_extract(term, pattern)) %>% 
      summarise(mean = mean(value, na.rm = TRUE)) %>% 
      na.omit()
    

    library(dplyr)
    
    mylist <- c("dog", "fish", "eel")
    
    df %>% 
      separate_rows(term) %>% 
      group_by(term) %>% 
      summarise(mean = mean(value, na.rm = TRUE)) %>% 
      filter(term %in% mylist)
    
     term   mean
      <chr> <dbl>
    1 dog     8  
    2 eel    26.5
    3 fish    4.5
    

    【讨论】:

      【解决方案2】:

      str_extractunnest 的选项

      library(dplyr)
      library(tidyr)
      library(stringr)
      v1 <-  c("dog", "fish", "eel")
      df1 %>%
        mutate(term = str_extract_all(term, str_c(v1, collapse="|"))) %>% 
        unnest(term) %>% 
        group_by(term) %>% 
        summarise(mean = mean(value))
      # A tibble: 3 × 2
        term   mean
        <chr> <dbl>
      1 dog     8  
      2 eel    26.5
      3 fish    4.5
      

      【讨论】:

        【解决方案3】:

        你想要这个吗?

        
        df %>% 
          separate_rows(term) %>% 
          filter(term %in% c("dog", "fish", "eel"))
        

        【讨论】:

        • 不完全是,为了清楚起见,我已经编辑了
        猜你喜欢
        • 2021-01-20
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2017-05-21
        • 1970-01-01
        相关资源
        最近更新 更多