计算一个数据帧中的字符串在 R dplyr 中出现到另一个数据帧的次数

Count how many times strings from one data frame appear to another data frame in R dplyr

我有两个如下所示的数据框:

df1 <- data.frame(reference=c("cat","dog"))
print(df1)
#>   reference
#> 1       cat
#> 2       dog
df2 <- data.frame(data=c("cat","car","catt","cart","dog","dog","pitbull"))
print(df2)
#>      data
#> 1     cat
#> 2     car
#> 3    catt
#> 4    cart
#> 5     dog
#> 6     dog
#> 7 pitbull

reprex package (v2.0.1)

于 2021-12-29 创建

我想找出 df1 中的 cat 和 dog 这两个词在 df2 中出现了多少次。 我希望我的数据看起来像这样

animals   n
cat       1
dog       2

感谢任何帮助或指导。我的参考列表很大。我尝试对其中的每一个进行 grep,但需要时间。

感谢您的宝贵时间。节日快乐

加入可能会更快

library(data.table)
setDT(df2)[, .(animals = data)][df1, .(n = .N), 
     on = .(animals = reference), by = .EACHI]
   animals n
1:     cat 1
2:     dog 2

或者在subset输入base R

中的数据后使用table
table(subset(df2, data %in% df1$reference, select = data))

一个可能的解决方案,基于tidyverse

library(tidyverse)

df1 <- data.frame(reference=c("cat","dog"))
df2 <- data.frame(data=c("cat","car","catt","cart","dog","dog","pitbull"))

df1 %>% 
  group_by(animal = reference) %>% 
  summarise(n = sum(reference == df2$data), .groups = "drop")

#> # A tibble: 2 × 2
#>   animal     n
#>   <chr>  <int>
#> 1 cat        1
#> 2 dog        2

这是第三个选项:

library(tidyverse)

df1 <- tibble(reference=c("cat","dog"))
df2 <- tibble(data=c("cat","car","catt","cart","dog","dog","pitbull"))

df2 |>
  count(data) |>
  filter(data %in% df1$reference) |>
  rename(animal = data)
#> # A tibble: 2 x 2
#>   animal     n
#>   <chr>  <int>
#> 1 cat        1
#> 2 dog        2

更新:感谢 Gregor Thomas:

library(dplyr)

left_join(df1,df2, by=c("reference"="data")) %>% 
  count(reference)

输出:

  reference n
1       cat 1
2       dog 2

我们可以使用 semi_join 然后 count:

library(dplyr)

semi_join(df2,df1, by=c("data"="reference")) %>% 
  count(data)
  data n
1  cat 1
2  dog 2

我们可以使用 str_count,将第二个 df 中的列折叠成一个字符串。

library(tidyverse)

df1 %>%
  transmute(animals = reference, n = str_c(df2$data, collapse = " ") %>%
    str_count(str_c("\b", reference, "\b")) )
#>   animals n
#> 1     cat 1
#> 2     dog 2

reprex package (v2.0.1)

于 2021-12-29 创建
df1$n <- colSums(outer(df2$data, df1$reference, '=='))

df1
#>   reference n
#> 1       cat 1
#> 2       dog 2