计算一个数据帧中的字符串在 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
我有两个如下所示的数据框:
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