Создать новый столбец, подсчитывающий количество общих слов между двумя другими столбцами в R? - PullRequest
1 голос
/ 26 мая 2020

Какой самый простой способ подсчитать количество общих слов между двумя столбцами в кадре данных R (по строкам)?

Например:

col_1          col_2          shared_words
"car truck"    "car fish"     1
"car"          "car boat"     1
"car boat"     "boat car"     2
"truck boat"   "car"          0

Я уже использую dplyr / stringr, поэтому для них не будут добавляться зависимости, если они позволяют более простое решение.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 мая 2020
  df %>% 
    mutate(count = str_count(col_1, sprintf("\\b(%s)\\b",str_replace_all(col_2," +","|"))))

       col_1    col_2 shared_words count
1  car truck car fish            1     1
2        car car boat            1     1
3   car boat boat car            2     2
4 truck boat      car            0     0
2 голосов
/ 26 мая 2020

В base R мы можем разделить столбцы по пробелу (strsplit - предполагая character класс), затем получить intersect каждого из соответствующих элементов list с Map и вернуть lengths для создания столбца shared_words

df1$shared_words <- lengths(Map(intersect, strsplit(df1$col_1, " "), 
                  strsplit(df1$col_2, ' ')))
df1$shared_words
#[1] 1 1 2 0

data

df1 <- structure(list(col_1 = c("car truck", "car", "car boat", "truck boat"
), col_2 = c("car fish", "car boat", "boat car", "car")), class = "data.frame",
row.names = c(NA, 
-4L))
0 голосов
/ 27 мая 2020

Если вы можете использовать tidytext и tidyr, вот еще один длинный код. Он подходит для случая, когда одно и то же слово повторяется в одном столбце.

library(tidytext)
library(dplyr)
library(tidyr)

# make some data
df <-
    data.frame(
        stringsAsFactors = F,
        col_1 = c("car truck","car","car boat","truck boat", 'fish fish'), 
        col_2=c("car fish", "car boat", "boat car", "car", 'goat fish')) %>%
    mutate(row = row_number()) 

# find the words in each row for each column and make long format data
long_1 <- df %>% select(row, col_1) %>% unnest_tokens(word, col_1) %>% unique()
long_2 <- df %>% select(row, col_2) %>% unnest_tokens(word, col_2) %>% unique()

# join to make long format data for both columns
long <- 
    long_1 %>% 
    bind_rows(long_2) %>% 
    group_by(row) %>% 
    count(word, name = "wordcount") %>% 
    filter(wordcount > 1)

# count the shared words in rows
wordsummary <-
    long %>%
    count(wordcount, name="shared_words") %>% 
    select(row, shared_words)

# join back to the original data taking care to set NA to 0
summary <-
    df %>%
    left_join(wordsummary, by='row') %>%
    select(-row) %>%
    mutate(shared_words = replace_na(shared_words, 0))

summary
#       col_1     col_2 shared_words
#1  car truck  car fish            1
#2        car  car boat            1
#3   car boat  boat car            2
#4 truck boat       car            0
#5  fish fish goat fish            1
...