группировать по тексту в столбцах, искать общие записи в двух фреймах данных

Я пытаюсь сравнить столбцы из двух фреймов данных, чтобы извлечь элементы, которые появляются в обоих. Конкретно:

df1:
 state group species
1 CA 2 cat, dog, chicken, mouse
2 CA 1 cat
3 NV 1 dog, chicken
4 NV 2 chicken
5 WA 1 chicken, rat, mouse, lion
6 WA 2 dog, cat
7 WA 3 dog, chicken
8 WA 4 cat, chicken

df2:
 state special_species
1 CA cat
2 CA chicken
3 CA mouse
4 WA cat
5 WA chicken
6 NV dog

Мне интересно определить, какие из special_species из df2 присутствуют в df1. Мне нужен новый фрейм данных, в котором есть состояние, группа и особый вид. Я думаю, что это должна быть комбинация соединения, group_by и summarize, но я не могу заставить это работать.


person nso921    schedule 03.12.2019    source источник


Ответы (1)


Мы можем разделить столбец «виды» в «df1» на , с separate_rows, а затем выполнить соединение

library(tidyr)
library(dplyr)
separate_rows(df1, species) %>%
    select(-group) %>%
    distinct %>%
    intersect(set_names(df2, c('state', 'species')))
#  state species
#1    CA     cat
#2    CA chicken
#3    CA   mouse
#4    NV     dog
#5    WA chicken
#6    WA     cat

Or do a inner_join

separate_rows(df1, species) %>%
   select(-group) %>%
   distinct %>%
    inner_join(df2, by = c('state', 'species' = 'special_species'))

данные

df1 <- structure(list(state = c("CA", "CA", "NV", "NV", "WA", "WA", 
"WA", "WA"), group = c(2L, 1L, 1L, 2L, 1L, 2L, 3L, 4L), species = c("cat, dog, chicken, mouse", 
"cat", "dog, chicken", "chicken", "chicken, rat, mouse, lion", 
"dog, cat", "dog, chicken", "cat, chicken")), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

df2 <- structure(list(state = c("CA", "CA", "CA", "WA", "WA", "NV"), 
    special_species = c("cat", "chicken", "mouse", "cat", "chicken", 
    "dog")), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6"))
person akrun    schedule 03.12.2019