Ifelse заявление с 4 условиями - PullRequest
0 голосов
/ 16 мая 2019

На следующих примерах данных я пытаюсь создать новый столбец «NOTA_NUM» (значение 0, или 1, или 2, или 3, или 4) в моем фрейме данных (df) на основе значений четырех условных переменных («A"," B "," C "," D "," E ") из одного существующего столбца (column1).

Я уже пробовал:

df$NOTA_NUM <- ifelse(rowSums(df[ , "column1"]=="A"), 0,
        ifelse(rowSums(df[ , "column1"]=="B"), 1,
               ifelse(rowSums(df[ ,"column1"]=="C"), 2,
                      ifelse(rowSums(df[ , "column1"]=="D",3,4))

, но это не такработать так, как я хотел бы.

Я хочу, чтобы "NOTA_NUM" выглядело так:

column1   NOTA_NUM
A             0
C             2
B             1
D             3
E             4

Ответы [ 4 ]

4 голосов
/ 16 мая 2019

Вот несколько подходов.Пакеты не используются.

1) match Использование DF, которое воспроизводимо показано в примечании, в конце соответствует каждому элементу от column1 до LETTERS[1:4] и 5, если не найдено.Вычтите 1 из этого.

transform(DF, NOIA_NUM = match(column1, LETTERS[1:4], nomatch = 5) - 1)

, давая:

  column1 NOIA_NUM
1       A        0
2       C        2
3       B        1
4       D        3
5       E        4

2) переключатель Другая возможность заключается в использовании switch:

transform(DF, NOTA_NUM = sapply(column1, switch, A = 0, B = 1, C = 2, D = 3, 4))

3) арифметика Используется арифметическое выражение, которое оценивается до требуемых значений:

transform(DF, NOTA_NUM = (0-4) * (column1 == "A") + 
                         (1-4) * (column1 == "B") + 
                         (2-4) * (column1 == "C") + 
                         (3-4) * (column1 == "D") + 
                         4)

Примечание

DF <- data.frame(column1 =  c("A", "C", "B", "D", "E"), stringsAsFactors = FALSE)
1 голос
/ 16 мая 2019

Мне нравится dplyr::case_when для следующих ситуаций:

library(dplyr)

df <- data.frame(column1 = c("A", "C", "B", "D", "E")) %>% 
  mutate(NOTA_NUM = case_when(column1 == "A" ~ 0, 
                              column1 == "B" ~ 1, 
                              column1 == "C" ~ 2, 
                              column1 == "D" ~ 3, 
                              TRUE ~ 4))
0 голосов
/ 16 мая 2019

Не уверен, что я бы рекомендовал as.numeric(factor(...)) в качестве общего решения, но подходит для вашего случая:

library(dplyr)

set.seed(1001) # for reproducible sample
# column1 = factor as stringsAsFactors = TRUE (default)
data.frame(column1 = sample(LETTERS[1:5], 50, replace = TRUE)) %>% 
  mutate(NOTA_NUM = as.numeric(column1)-1)
0 голосов
/ 16 мая 2019

Я бы избежал ifelse для этой цели.Вы должны использовать более эффективный и компактный подход к поиску или преобразованию таблицы.Попробуйте использовать именованный вектор в качестве таблицы и передайте входные данные в функцию "[":

> lookup = c(A=0, C= 2, B =  1, D= 3, E = 4)
> df <- data.frame( cl1 = names(lookup))
> df
  cl1
1   A
2   C
3   B
4   D
5   E
> df$NOTA_NUM= lookup[df$cl1]
> df
  cl1 NOTA_NUM
1   A      0
2   C      1
3   B      2
4   D      3
5   E      4

Если вам нужны эти буквы, заключите их в кавычки в векторе поиска, но помните, что функция data.frameсделает их факторами, если вы явно не запретите это действие по умолчанию.См. ?data.frame для правильного использования stringsAsFactors параметра

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