R Строки с точным соответствием в двух столбцах - PullRequest
2 голосов
/ 13 апреля 2019

У меня есть фрейм данных следующей формы:

Column1 = c('Elephant,Starship Enterprise,Cat','Random word','Word','Some more words, Even more words')
Column2=c('Rat,Starship Enterprise,Elephant','Ocean','No','more')
d1 = data.frame(Column1,Column2)

enter image description here

То, что я хочу сделать, это искать и считать точныйсовпадение слов в столбце 1 и столбце 2. В каждом столбце может быть несколько слов, разделенных запятой.

Например, в строке 1 мы видим два распространенных слова: а) звездный корабль и б) слон.Однако в строке 4, хотя слово «больше» присутствует в обоих столбцах, точная строка (еще несколько слов и даже больше слов) не отображается.Ожидаемый результат будет примерно таким.

enter image description here

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Разбить столбцы на запятую и сосчитать пересечение слов

mapply(function(x, y) length(intersect(x, y)), 
        strsplit(d1$Column1, ","), strsplit(d1$Column2, ","))
#[1] 2 0 0 0

или tidyverse способ

library(tidyverse)
d1 %>%
  mutate(Common = map2_dbl(Column1, Column2, ~ 
      length(intersect(str_split(.x, ",")[[1]], str_split(.y, ",")[[1]]))))


#                           Column1                          Column2 Common
#1 Elephant,Starship Enterprise,Cat Rat,Starship Enterprise,Elephant      2
#2                      Random word                            Ocean      0
#3                             Word                               No      0
#4 Some more words, Even more words                             more      0
1 голос
/ 13 апреля 2019

Мы можем сделать это с cSplit

library(splitstackshape)
library(data.table)
v1 <- cSplit(setDT(d1, keep.rownames = TRUE), 2:3, ",", "long")[, 
    length(intersect(na.omit(Column1), na.omit(Column2))), rn]$V1
d1[, Common := v1][, rn := NULL][]
#                             Column1                          Column2 Common
#1: Elephant,Starship Enterprise,Cat Rat,Starship Enterprise,Elephant      2
#2:                      Random word                            Ocean      0
#3:                             Word                               No      0
#4: Some more words, Even more words                             more      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...