R: выделение нескольких элементов в одном предложении во фрейме данных - PullRequest
1 голос
/ 25 июня 2019

У меня есть таблица, в которой содержится список слов, которые я хотел бы выделить, и текст, в котором я хотел бы выделить его:

df <- data_frame(
  tags = list(list("sphinx", "judge", "vow"), list("jackdaws", "sphinx", "love"), list()),
  text = list("Sphinx of black quartz, judge my vow", "Jackdaws love my big sphinx of quartz", 
           "Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person.")
) %>%
  mutate(text = as.character(text))

Я думал о том, чтобы сделать что-то вроде

gsub(df$tags[1][[1]][1], paste0('<span style="background-color: #FFFF00">', df$tags[1][[1]][1], '</span>'), df$text[1], ignore.case = TRUE)

Однако я изо всех сил пытаюсь выяснить, как заменить несколько вещей в одном предложении, если я, например, сделаю цикл, он перезапишется сам, и я заменю только последнее слово в списке.

Кроме того, я не совсем уверен, как заставить его работать внутри фрейма данных.

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

df_output <- data_frame(
      tags = list(list("sphinx", "judge", "vow"), list("jackdaws", "sphinx", "love"), list()),
      text = list("<span style="background-color: '#FFFF00'">Sphinx</span> of black quartz, <span style="background-color: '#FFFF00'">judge</span> my <span style="background-color: '#FFFF00'">vow<span>", "<span style="background-color: '#FFFF00'">Jackdaws</span> <span style="background-color: '#FFFF00'">love</span> my big <span style="background-color: '#FFFF00'">sphinx</span> of quartz", 
               "Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person.")
    ) %>%
      mutate(text = as.character(text))

1 Ответ

1 голос
/ 25 июня 2019

Если вы можете принять упрощенный объект tags (не вложенный список), вы можете сделать это итеративно, как это.Также обратите внимание, что я заменил первое слово в tags на заглавную S.

tags <- list("Sphinx", "judge", "vow", "jackdaws", "sphinx", "love")
text <- list("Sphinx of black quartz, judge my vow", "Jackdaws love my big sphinx of quartz", 
              "Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person.")

for (i in seq_along(tags)) {
  for (j in seq_along(text)) {
    text[[j]] <- gsub(sprintf("(%s)", tags[[i]]),
                      replacement = '<span style="background-color: #FFFF00">\\1</span>',
                      x = text[[j]])
  }
}

[[1]]
[1] "<span style=\"background-color: #FFFF00\">Sphinx</span> of black quartz, <span style=\"background-color: #FFFF00\">judge</span> my <span style=\"background-color: #FFFF00\">vow</span>"

[[2]]
[1] "Jackdaws <span style=\"background-color: #FFFF00\">love</span> my big <span style=\"background-color: #FFFF00\">sphinx</span> of quartz"

[[3]]
[1] "Carved symbols in a mountain hollow on the bank of an inlet irritated an eccentric person."
...