Как мне создать новую переменную в R, если она еще не существует? - PullRequest
0 голосов
/ 16 июня 2020

В настоящее время я использую tidytext в R для анализа тональности. Я использую код, очень похожий на тот, что указан в виньетке. Это приведенный пример: https://cran.r-project.org/web/packages/tidytext/vignettes/tidytext.html

library(tidyr)
bing <- get_sentiments("bing")

janeaustensentiment <- tidy_books %>%
  inner_join(bing) %>%
  count(book, index = line %/% 80, sentiment) %>%
  spread(sentiment, n, fill = 0) %>%
  mutate(sentiment = positive - negative)

Я адаптировал это для использования на довольно коротких блоках текста, используя тот же самый inner_join%>% spread%>% mutate прогрессия. Проблема в том, что у меня есть по крайней мере один блок текста, который вызывает у меня проблемы. Я думаю, это потому, что в нем вообще нет негативных настроений. Это сообщение об ошибке:

x object 'negative' not found
Input 'sentiment' is 'positive - negative'

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

mutate(negative = 0) ifelse(exists())

Но я не могу понять, как это будет работать. Кто-нибудь знает, как создать новую переменную, если она не существует, но не создать ее, если она есть? Или, альтернативно, если есть решение этой проблемы в самом tidytext.

EDIT 17 июня: Я только что проверил, что происходит после «распространения», и действительно, нет «отрицательной» переменной / столбца. Поэтому возможно, что если я смогу создать новую переменную - если и только если она еще не существует - со значениями «0», я смогу продолжить.

1 Ответ

1 голос
/ 18 июня 2020

Без данных примера немного сложно сказать наверняка, но я думаю, вы хотите попробовать использовать complete() из . Вы можете указать, в каких столбцах вы хотите убедиться, что у вас есть все комбинации, и какое значение использовать для заполнения любых недостающих данных. Например, предположим, что в документе 2 отсутствует негативное восприятие:

library(tidyverse)

sentiments <- tibble(
  document    = c(1, 2, 3, 1, 3),
  sentiment   = c("positive", "positive", "positive", "negative", "negative"),
  n           = c(5, 8, 2, 9, 3)
)

sentiments
#> # A tibble: 5 x 3
#>   document sentiment     n
#>      <dbl> <chr>     <dbl>
#> 1        1 positive      5
#> 2        2 positive      8
#> 3        3 positive      2
#> 4        1 negative      9
#> 5        3 negative      3

sentiments %>%
  complete(document, sentiment, fill = list(n = 0))
#> # A tibble: 6 x 3
#>   document sentiment     n
#>      <dbl> <chr>     <dbl>
#> 1        1 negative      9
#> 2        1 positive      5
#> 3        2 negative      0
#> 4        2 positive      8
#> 5        3 negative      3
#> 6        3 positive      2

Создано 18.06.2020 пакетом REPEX (v0.3.0.9001)

Если вы примените такой подход к своим документам, я надеюсь, что вы сможете избежать возникшей проблемы и перейти к spread() (или более актуальному двоюродный брат, pivot_wider()).

...