Неверный уровень фактора, сгенерированный NA (оператор if-else не будет работать) в R - PullRequest
0 голосов
/ 01 марта 2020

В настоящее время я пытаюсь решить проблему if-else. У меня есть один столбец в моем фрейме данных, который содержит числа: этот столбец называется «настроение». Я хочу добавить второй столбец, для которого каждой строке присваивается слово: «положительный», «отрицательный» или «нейтральный». Этот столбец я называю «оценка». Критерий состоит в том, что оценка столбца должна содержать слово «положительный», если столбец настроений в этой строке содержит число выше 0,25, «отрицательный», если он содержит число ниже -0,25, и «нейтральный» в противном случае. Я попытался запустить следующую конструкцию if-else:

here's the code

Впоследствии я бы связал вектор оценки с моим существующим data.frame, но это не так проблема, я знаю, как это сделать. Но это утверждение генерирует «нейтральный» штраф, но для каждой строки, которая должна быть «положительной» или «отрицательной», появляется NA. Понятия не имею, как это решить. Я новичок в R, но отчаянно нуждаюсь в вашей помощи. «Недопустимый уровень фактора, созданный NA» - предупреждение, которое я получаю. Проблема, похоже, заключается не в том, что столбец не имеет числового типа c, потому что это так.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Если я правильно понимаю, ОП хочет добавить дополнительный столбец evaluation с тремя уровнями фактора, который зависит от числовых значений c в столбце sentiment.

Этого можно достичь без используя for l oop через векторные функции R.

К сожалению, OP не предоставил образец набора данных, поэтому нам нужно создать его с помощью

df <- data.frame(sentiment = c(-0.5, -0.25, 0, 0.25, 0.5))

cut() Функция может быть использована для преобразования чисел c в коэффициент. Он делит диапазон x на интервалы и кодирует значения в x в зависимости от того, на какой интервал они попадают:

df$evaluation <- cut(df$sentiment, breaks = c(-Inf, -0.25, 0.25, Inf), 
                     labels = c("negative", "neutral", "postive"))
df
  sentiment evaluation
1     -0.50   negative
2     -0.25   negative
3      0.00    neutral
4      0.25    neutral
5      0.50    postive

cut() использует правые закрытые интервалы по умолчанию. Таким образом, крайний случай -0.25 сопоставлен с «отрицательным». который не полностью соответствует требованиям OP и образцу кода OP.

В качестве альтернативы, вместо cut():

df$evaluation <- ifelse(df$sentiment < -0.25, "negative",
                        ifelse(df$sentiment > 0.25, "positive", "neutral"))
df
  sentiment evaluation
1     -0.50   negative
2     -0.25    neutral
3      0.00    neutral
4      0.25    neutral
5      0.50   positive
могут использоваться вложенные вызовы ifelse().

Теперь это полностью соответствует требованию OP и образцу кода OP, который требует, чтобы -0,25 и 0,25 были симметрично сопоставлены с «нейтральным».

Для полноты, есть также функция case_when() из пакета dplyr, который можно использовать, чтобы избежать вложенных вызовов ifelse():

library(dplyr)
df %>% 
  mutate(evaluation = case_when(
    sentiment < -0.25 ~ "negative",
    sentiment >  0.25 ~ "positive",
    TRUE ~ "neutral"
  ))
  sentiment evaluation
1     -0.50   negative
2     -0.25    neutral
3      0.00    neutral
4      0.25    neutral
5      0.50   positive
0 голосов
/ 01 марта 2020

M.,

Я думаю, что ваша проблема связана с rbind введением символа и data.frame. Попробуйте вместо этого:

## I'm assuming reviews is a data.frame where column 9 is the sentiment data

sentiment = reviews[, 9]
evaluation = character()

for (i in 1:length(sentiment)) {
  if (sentiment[i] > .25) {
    evaluation[i] = 'positive'
  } else {
    if (sentiment[i] < -.25) {
      evaluation[i] = 'negative'
    } else {
      evaluation [i] = 'neutral'
    }
  }
}

reviews[['evaluation']] = evaluation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...