2017-02-15 28 views
0

У меня есть большой фрейм данных, который содержит множество строковых значений, которые я хочу очистить.Условные мутации мутаций данных

Пример:

students <- data.frame(name = c("John", "Jerry", "Bill", "Tom", "Mary", "Bill"), 
         class = c("A", "B", "-", "#NA", "A", "low"), stringsAsFactors = FALSE) 

Я хочу, чтобы каждый студент, который не в классе А, В или С, чтобы быть установлен в D. Мое текущее решение:

'%!in%' <- function(x,y)!('%in%'(x,y)) 
for(i in 1:nrow(students)) { 
    if(students$class[i] %!in% c("A", "B", "C")) { 
    students$class[i] <- "D" 
    } 
} 

Есть ли лучше чем это, предпочтительно с трубопроводом, так как существует такое количество столбцов?

Спасибо!

+0

Другой способ заключается в '' replace', студенты $ класса

+0

Или очень похоже 'студенты%>% mutate (класс = if_else (класс% в% LETTERS [1: 3], класс," D "))' – Axeman

+0

Также см. forcats :: fct_other'. – Axeman

ответ

1

Мы можем сделать это без цикла, как присвоение векторизованы

students$class[students$class %!in% c("A", "B", "C")] <- "D" 
students 
# name class 
#1 John  A 
#2 Jerry  B 
#3 Bill  D 
#4 Tom  D 
#5 Mary  A 
#6 Bill  D