Функция R не перебирает столбец, но повторяет результат первой строки - PullRequest
3 голосов
/ 06 ноября 2019

Я пытаюсь использовать функцию стемминга, предложенную в корпусе виньетки здесь: https://cran.r -project.org / web / packages / corpus / vignettes / stemmer.html

но когда я пытаюсь запустить функцию для всего столбца, кажется, что я просто повторяю результат для первой строки до остальных строк. Я предполагаю, что это связано с [[1]] в следующей функции. Я предполагаю, что решение - что-то вроде "для меня в x", но я недостаточно знаком с написанием функций, чтобы знать, как решить эту проблему.

df <- data.frame(x = 1:7, y= c("love", "lover", "lovely", "base", "snoop", "dawg", "pound"), stringsAsFactors=FALSE)

stem_hunspell <- function(term) {
    # look up the term in the dictionary
    stems <- hunspell::hunspell_stem(term)[[1]]

    if (length(stems) == 0) { # if there are no stems, use the original term
        stem <- term
    } else { # if there are multiple stems, use the last one
        stem <- stems[[length(stems)]]
    }

    stem
}

df[3] <- stem_hunspell(df$y)

1 Ответ

1 голос
/ 06 ноября 2019

Ваша интуиция верна.

hunspell_stem(term) возвращает list длины length(term) векторов символов.

Векторы, кажется, имеют слово, но только если оно было найденов словаре в качестве первого элемента и стебля в качестве второго, если он еще не является стеблем.

> hunspell::hunspell_stem(df$y)
[[1]]
[1] "love"

[[2]]
[1] "lover" "love" 

[[3]]
[1] "lovely" "love"  

[[4]]
[1] "base"

[[5]]
[1] "snoop"

[[6]]
character(0)

[[7]]
[1] "pound"

Следующая функция возвращает либо стебель, либо исходный термин

stem_hunspell <- function(term) {
  stems <- hunspell::hunspell_stem(term)
  output <- character(length(term))

  for (i in seq_along(term)) {
    stem <- stems[[i]]
    if (length(stem) == 0) {
      output[i] <- term[i]
    } else {
      output[i] <- stem[length(stem)]
    }
  }
  return(output)
}

Если вы хотите, чтобы dawg не возвращался, функция становится проще:

stem_hunspell <- function(term) {
  stems <- hunspell::hunspell_stem(term)
  output <- character(length(term))

  for (i in seq_along(term)) {
    stem <- stems[[i]]
    if (length(stem) > 0) {
      output[i] <- stem[length(stem)]
    }
  }
  return(output)
}
...