поиск сходства в данных с использованием grepl - PullRequest
0 голосов
/ 09 июня 2019

У меня большой фрейм данных:

df
id product
1  milk
2  200
3  gr.
4  Low
5  fat
6  milkshake
7  200
8  gr.
9  High
10 fat
...

для каждого слова мне нужно понять, какие слова похожи на него, я использовал grepl, и я могу сделать это только для каждого слова, но я не знаю, как применить его для всего фрейма данных.

matches1<-paste(grepl(words_unlist[1],words_unlist))
matches1<- as.data.frame(matches1)

id matches1
1  1
2  0
3  0
4  0
5  0
6  1
7  0
8  0
9  0
10 0

но мне нужно сделать то же самое для всех слов. как это:

df
id product     matches1   matches2   matches3   ... matches10
1  milk        1          0          0          ... 0
2  200         0          1          0          ... 0
3  gr.         0          0          1          ... 0
4  Low         0          0          0          ... 0
5  fat         0          0          0          ... 1
6  milkshake   1          0          0          ... 0
7  200         0          1          0          ... 0
8  gr.         0          0          1          ... 0
9  High        0          0          0          ... 0
10 fat         0          0          0          ... 1
...

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Опция с lapply

df[paste0("matches", seq_len(nrow(df)))] <- +(do.call(cbind, 
              lapply(df$product, grepl, df$product)))
df
#   id   product matches1 matches2 matches3 matches4 matches5 matches6 matches7 matches8 matches9 matches10
#1   1      milk        1        0        0        0        0        0        0        0        0         0
#2   2       200        0        1        0        0        0        0        1        0        0         0
#3   3       gr.        0        0        1        0        0        0        0        1        0         0
#4   4       Low        0        0        0        1        0        0        0        0        0         0
#5   5       fat        0        0        0        0        1        0        0        0        0         1
#6   6 milkshake        1        0        0        0        0        1        0        0        0         0
#7   7       200        0        1        0        0        0        0        1        0        0         0
#8   8       gr.        0        0        1        0        0        0        0        1        0         0
#9   9      High        0        0        0        0        0        0        0        0        1         0
#10 10       fat        0        0        0        0        1        0        0        0        0         1

Или с использованием tidyverse

library(tidyverse)
df %>%
   mutate(similar = map(product, ~  
           str_detect(.x, df$product) %>% 
                     as.integer %>% 
                     as.list %>% 
                      set_names(str_c('matches', seq_len(nrow(df)))) %>% 
                     as_tibble )) %>%
    unnest

data

df <- structure(list(id = 1:10, product = c("milk", "200", "gr.", "Low", 
  "fat", "milkshake", "200", "gr.", "High", "fat")), 
  class = "data.frame", row.names = c(NA, -10L))
0 голосов
/ 09 июня 2019

Мы можем использовать sapply и сопоставлять каждый product со всем столбцом df$Product с grepl

df[paste0("matches", seq_len(nrow(df)))] <- +(sapply(df$product, grepl, df$product))

df
#   id   product matches1 matches2 matches3 matches4 matches5 matches6 matches7 matches8 matches9 matches10
#1   1      milk        1        0        0        0        0        0        0        0        0         0
#2   2       200        0        1        0        0        0        0        1        0        0         0
#3   3       gr.        0        0        1        0        0        0        0        1        0         0
#4   4       Low        0        0        0        1        0        0        0        0        0         0
#5   5       fat        0        0        0        0        1        0        0        0        0         1
#6   6 milkshake        1        0        0        0        0        1        0        0        0         0
#7   7       200        0        1        0        0        0        0        1        0        0         0
#8   8       gr.        0        0        1        0        0        0        0        1        0         0
#9   9      High        0        0        0        0        0        0        0        0        1         0
#10 10       fat        0        0        0        0        1        0        0        0        0         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...