2016-10-30 3 views
0

Data Frame XЗаменить NA в данном типе Фактора R

Кадр данных Х выглядит следующим образом

State  code 
New Jersey 1 
New York 2 
Califronia NA 

Все столбцы являются факторами. Я ищу, чтобы заменить NA с текстом или 0. Так что я могу транспонировать их позже.

Когда я пытаюсь запустить эту команду

X[is.na(X)] <- "0" 

я получаю следующие ошибки

Warning messages: 
1: In `[<-.factor`(`*tmp*`, thisvar, value = "0") : 
    invalid factor level, NA generated 
2: In `[<-.factor`(`*tmp*`, thisvar, value = "0") : 
    invalid factor level, NA generated 
3: In `[<-.factor`(`*tmp*`, thisvar, value = "0") : 
    invalid factor level, NA generated 
4: In `[<-.factor`(`*tmp*`, thisvar, value = "0") : 
    invalid factor level, NA generated 

Там нет никаких изменений в NA значений.

+0

попробовать 'библиотека (автомобиль); X $ код <- перекодировать (X $ код,«NA = 0 ")' – akrun

+3

'forcats :: fct_explicit_na (X $ code, 0)' – alistaire

+0

Спасибо. В моем кадре данных есть только факторы. У меня есть еще несколько столбцов с NA. Я хочу изменить все НС на «недостающие» или какой-либо текст. – BSM

ответ

0

Просто:

X$code <- as.character(X$code) #as.numeric works just as good 
X[is.na(X)] <- "0" 
X$code <- as.factor(as.numeric(X$code)) 

В цикле по всем столбцам это будет выглядеть следующим образом:

for (i in 2:ncol(X)) { 
    X[,i] <- as.character(X[,i]) 
    X[which(is.na(X[,i])==TRUE),i] <- "0" 
    X[,i] <- as.factor(as.numeric(X[,i])) 
} 

И символьное значение, как это:

for (i in 2:ncol(X)) { 
    X[,i] <- as.character(X[,i]) 
    X[which(is.na(X[,i])==TRUE),i] <- "Not Assigned" 
    X[,i] <- as.factor(X[,i]) 
} 

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

for (i in 2:ncol(X)) { 
    levels(X[,i]) <- c(levels(X[,i]), "Not Assigned") 
    X[which(is.na(X[,i])==TRUE),i] <- "Not Assigned" 
} 
0

Код, который вы написали, будет работать для матриц, если вы не против преобразования взад и вперед.

> X 
     State code code2 
1 NewJersey 1 NA 
2 NewYork 2  0 
3 Califronia NA  4 

> X<-as.matrix(X) 
> X[is.na(X)] <- "0" 
> X<-as.data.frame(X) 
> X 
     State code code2 
1 NewJersey 1  0 
2 NewYork 2  0 
3 Califronia 0  4 

> str(X) 
'data.frame': 3 obs. of 3 variables: 
$ State: Factor w/ 3 levels "Califronia","NewJersey",..: 2 3 1 
$ code : Factor w/ 3 levels " 1"," 2","0": 1 2 3 
$ code2: Factor w/ 3 levels " 0"," 4","0": 3 1 2 
3

Другой вариант с использованием встроенного factor:

df <- data.frame(a=letters[1:3], b=c("d", "e", NA)) 
df 
    a b 
1 a d 
2 b e 
3 c <NA> 

Теперь перекодировать фактор с factor:

df$b <- factor(df$b, exclude = NULL, 
       levels = c("d", "e", NA), 
       labels = c("d", "e", "f")) 
df 
    a b 
1 a d 
2 b e 
3 c f 

И для многих факторов, следующие могут быть полезны:

df[] <- lapply(df, function(x){ 
    # check if you have a factor first: 
    if(!is.factor(x)) return(x) 
    # otherwise include NAs into factor levels and change factor levels: 
    x <- factor(x, exclude=NULL) 
    levels(x)[is.na(levels(x))] <- "0" 
    return(x) 
    }) 
0

давайте создадим случайный ДФ с уровнями фактора

df <- data.frame(a=sample(0:10, size=10, replace=TRUE), 
       b=sample(20:30, size=10, replace=TRUE)) 
df[df$a==0,'a'] <- NA 
df$a <- as.factor(df$a) 

другой способ сделать это:

#check levels 
levels(df$a) 
#[1] "3" "4" "7" "9" "10" 

#add new factor level. i.e 88 in our example 
df$a = factor(df$a, levels=c(levels(df$a), 88)) 

#convert all NA's to 88 
df$a[is.na(df$a)] = 88 

#check levels again 
levels(df$a) 
#[1] "3" "4" "7" "9" "10" "88" 
Смежные вопросы