Сопоставление подстрок со строками в списке и запись каждого сопоставленного индекса - PullRequest
1 голос
/ 14 июля 2020

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

my_list <- list("hello there", "how are you?", "I am fine thanks")

words <- data.frame(text = c("he", "she", "they", "you", "I"), index = NA)

Окончательный результат должен быть:

> words
  text index
1   he    NA
2  she    NA
3 they    NA
4  you     2
5    I     3

Я пробовал al oop с grepl, который не сработал как при записи содержимого вместо индекса, так и из-за неправильной записи элемента:

for (i in 1:nrow(words)){
  x <- grepl(words$text[i], my_list, fixed = T)
  if (x == T) {
    words$index[i] <- paste(my_list[i])
  }
}

> words
  text       index
1   he hello there
2  she        <NA>
3 they        <NA>
4  you        <NA>
5    I        <NA>

Я также попробовал этот ответ который выглядел хорошо но который возвращал только вектор FALSE до тех пор, пока my_list.

EDIT: теперь я немного ближе к этому l oop, хотя он все еще неправильно индексирует "he" из-за "_he_llo there" .

for (i in seq_along(my_list)){
  for (j in 1:nrow(words)){
    if (grepl(words$text[j], my_list[i], fixed = T) == T){
      words$index[[j]] <- i
    }
  }
}
> words
  text index
1   he     1
2  she    NA
3 they    NA
4  you     2
5    I     3

Итак, как мне сопоставить элемент? А затем, как я могу записать индекс согласованного элемента?

Спасибо!

1 Ответ

1 голос
/ 14 июля 2020

Одно решение, включающее dplyr, tidyr, string и purrr, может быть:

map2_dfr(.x = my_list,
         .y = 1:length(my_list),
         ~ set_names(str_detect(.x, paste0("\\b", words$text, "\\b")) * .y, words$text)) %>%
 summarise_all(max) %>%
 pivot_longer(everything(), names_to = "text", values_to = "index")

  text  index
  <chr> <int>
1 he        0
2 she       0
3 they      0
4 you       2
5 I         3

Или, если вам нужны НП:

map2_dfr(.x = my_list,
         .y = 1:length(my_list),
         ~ set_names(str_detect(.x, paste0("\\b", words$text, "\\b")) * .y, words$text)) %>%
 summarise_all(~ if (all(. == 0)) NA else max(.)) %>%
 pivot_longer(everything(), names_to = "text", values_to = "index")

  text  index
  <chr> <int>
1 he       NA
2 she      NA
3 they     NA
4 you       2
5 I         3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...