Создать новую двоичную переменную в зависимости от того, находится ли предыдущая переменная в векторе (R) - PullRequest
1 голос
/ 10 мая 2019

У меня есть список ответов на вопрос, и мне нужно создать новую переменную на основе этих ответов, разделив их на две категории. Это делается на основе того, в каком из двух списков отображаются ответы: один содержит все ответы, которые должны быть перекодированы в одну категорию (т. Е. Новая переменная имеет значение 0), а другой содержит все ответы, которые необходимо перекодировать в новую переменную. как 1.

Я пытался заставить это работать, используя цикл for, который циклически перебирает каждую строку, проверяет переменную ответа и присваивает новое значение новой переменной на основе списка, в котором находится ответ, но когда я его запускаю это присваивает каждой строке значение 1 для новой переменной независимо от старой переменной.

Воспроизводимый пример:

df <- data.frame(state = state.name)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

for (i in seq_along(df$state)) {
  if (df$state[i] %in% AtoM) {
    df$state.bin <- 0
  } else if (df$state[i] %in% NtoZ) {
    df$state.bin <- 1
  } else {
    df$state.bin <- NA
  }
}
View(df) # when the result is viewed, the new state.bin variable has a value of 1 for every row

Должно быть, что первым 26 состояниям присвоено значение 0 для новой переменной, но все они присвоены 1. Но когда я проверяю df$state[1] %in% AtoM, он возвращает TRUE.

Что я делаю не так?

1 Ответ

2 голосов
/ 10 мая 2019

Вам нужно указать индекс для того, где в df$state.bin вы хотите поместить значение (df$state.bin[i], как вы это делали с df$state[i]), и вам также нужно создать переменную-заполнитель в вашем исходном df, что я сделал с state.bin = 0.

df <- data.frame(state = state.name,
                 state.bin = 0)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

for (i in seq_along(df$state)) {
  if (df$state[i] %in% AtoM) {
    df$state.bin[i] <- 0
  } else if (df$state[i] %in% NtoZ) {
    df$state.bin[i] <- 1
  } else {
    df$state.bin[i] <- NA
  }
}

> df

            state state.bin
1         Alabama         0
2          Alaska         0
3         Arizona         0
4        Arkansas         0
5      California         0
6        Colorado         0

Вы также можете использовать dplyr:

df <- data.frame(state = state.name)
# create the reference lists
AtoM <- df$state[1:26]
NtoZ <- df$state[27:50]

df %>%
  mutate(state.bin = case_when(
    state %in% AtoM ~ 0,
    state %in% NtoZ ~ 1,
    TRUE ~ NA_real_
  ))

            state state.bin
1         Alabama         0
2          Alaska         0
3         Arizona         0
4        Arkansas         0
5      California         0
6        Colorado         0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...