首页 > 解决方案 > 使用 dplyr grep 术语列表、分组和汇总值

问题描述

我有一个看起来像这样的表:

  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

每个有 a 的实例都会'dog'计算mean.value

像这样的东西不起作用:

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

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

标签: rdplyrtidyverse

解决方案


也许是这样的?

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

推荐阅读