Как заменить диапазон значений int строковым символом в R - PullRequest
0 голосов
/ 10 апреля 2020

Я хотел бы заменить диапазон целочисленных значений строковым символом на основе условий.

Например, у меня есть фрейм данных

    Gender   Grade   Indus 
  1      1     610     15    
  2      1     110     29     
  3      2     210     32     
  4      1     250     20   
  5      2     420     37   
  6      2     430     19
  7      1     450     25

Я хотел бы заменить значения в столбце «Оценка» со строковым символом, основанным на следующих условиях:

prima =c(110,210:250,610)
secon =c(420,440:460)
vocat =c(430,470)

Если число в «Оценке» попадает в приму, например, если Оценка == 610, я хотел бы изменить число к слову «Первичный».

Я пытался использовать ...

mydf$Grade[mydf$Grade == prima] <- "Primary"
mydf$Grade[mydf$Grade == secon] <- "Secondary"
mydf$Grade[mydf$Grade == vocat] <- "Vocational"

, но это не сработало. Ошибка не возвращалась, но лишь очень немногие значения изменились на «Первичные» или «Вторичные», оставив кучу других чисел без изменений.

Я также пытался ...

for (i in mydf$Grade) {
    if (i %in% prima) mydf$Grade <- "Primary"
    else if (i %in% secon) mydf$Grade <- "Secondary"
    else if (I %in% vocat) mydf$Grade <- "Vocational"
}

, который также не работал. Все значения в «Grade» вместо этого превратились в «Primary». Эти два метода я опробовал на реальных данных, где мне также нужно 10 * 10 лет.

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

1 Ответ

1 голос
/ 10 апреля 2020

== делает поэлементное сравнение. Поскольку мы хотим сравнить несколько элементов, используйте %in%

mydf$Grade[mydf$Grade %in% prima] <- "Primary"
mydf$Grade[mydf$Grade %in% secon] <- "Secondary"
mydf$Grade[mydf$Grade %in% vocat] <- "Vocational"

или используйте dplyr::case_when

library(dplyr)
mydf %>%
  mutate(Grade = case_when(Grade %in% prima ~ "Primary", 
                           Grade %in% secon ~ "Secondary", 
                           Grade %in% vocat ~ "Vocational"))


#  Gender      Grade Indus
#1      1    Primary    15
#2      1    Primary    29
#3      2    Primary    32
#4      1    Primary    20
#5      2  Secondary    37
#6      2 Vocational    19
#7      1  Secondary    25

data

mydf <- structure(list(Gender = c(1L, 1L, 2L, 1L, 2L, 2L, 1L), Grade = c(610L, 
110L, 210L, 250L, 420L, 430L, 450L), Indus = c(15L, 29L, 32L, 
20L, 37L, 19L, 25L)), class = "data.frame", row.names = c(NA, -7L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...