Правила поменять слова - PullRequest
2 голосов
/ 06 мая 2019

У меня есть такой фрейм данных:

df <- data.frame(id = c(1,2), keywords = c("google, yahoo, air, cookie", "cookie, air"))

Я хотел бы реализовать правила, подобные следующим:

stocks <- c("google, yahoo")
climate <- c("air")
cuisine <- c("cookie")

и возьмите результаты вот так:

df_ne <- data.frame(id = c(1,2), keywords = c("stocks, climate, cuisine", "climate, cuisine")

Как можно это сделать?

Ответы [ 3 ]

3 голосов
/ 06 мая 2019

Вы можете использовать str_replace_all из stringr пакета

library(dplyr)
library(stringr)
df <- data.frame(id = c(1,2), keywords = c("google, yahoo, air, cookie", "cookie, air"))

df %>% 
  mutate(keywords = str_replace_all(keywords, 
    c("google, yahoo" = "stocks","air" = "climate", "cookie" = "cuisine")))
2 голосов
/ 06 мая 2019

Мне понравился ответ cholland (+1), но вы также можете использовать tidytext::unnest_tokens(), это будет проще, если я собираюсь иметь более шести слов.

Сначала выможет создать отображение df:

mapped <- rbind (data.frame(word_a = stocks, type = "stock", stringsAsFactors = F),
                 data.frame(word_a = climate, type = "climate", stringsAsFactors = F),
                 data.frame(word_a = cuisine, type = "cuisine", stringsAsFactors = F))

Теперь вы можете использовать упомянутую функцию, чтобы получить пару неопубликованных df для достижения цели:

library(tidytext)
library(stringr)
library(tidyverse)
mapped <- mapped %>%  unnest_tokens(word, word_a)

df %>% 
unnest_tokens(word, keywords) %>%    # split words
left_join(mapped) %>%                # join to map
group_by(id) %>%                     # group
summarise(keywords = str_c(unique(type), collapse = ",")) # collapse the word (unique)

# A tibble: 2 x 2
     id keywords             
  <dbl> <chr>                
1     1 stock,climate,cuisine
2     2 cuisine,climate   

Обратите внимание, что во второй строке есть перевернутые словавместо ожидаемого результата из-за того, что они в указанном порядке являются соответствующими словами в первом df.


С данными:

df <- data.frame(id = c(1,2), keywords = c("google, yahoo, air, cookie", "cookie, air"), stringsAsFactors = F)


stocks <- c("google, yahoo")
climate <- c("air")
cuisine <- c("cookie")
1 голос
/ 06 мая 2019

Вот наивное решение для начала:

key <- list(
  stocks = c("google", "yahoo"),
  climate = "air",
  cuisine = "cookie"
)

df2 <- df
#replace by the key
for (k in 1:length(key)){
  for(sk in key[[k]]){
    df2$keywords <- gsub(sk, names(key)[k], df2$keywords, fixed = TRUE)
  }
}
#remove duplicated items
df2$keywords <- lapply(strsplit(df2$keywords, ", "), function(l) paste(unique(l), sep = ","))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...