2010-07-28 2 views
48

У меня есть кадр данных, содержащий (в случайных местах) значение символа (скажем "foo"), которое я хочу заменить NA.Замена символьных значений NA в кадре данных

Каков наилучший способ сделать это во всем кадре данных?

+1

Не забудьте пересмотреть свой столбец as.numeric() переключение несколько символов из„Foo“в НС не будет принуждать весь набор - числовой. Вы должны заставить его. (Если это то, что вы делаете) –

ответ

61

Это:

df[ df == "foo" ] <- NA 
+12

Обратите внимание, что если вы пытались заменить NA на «foo», обратное ('df [df == NA] =" foo "') не будет работать; вам нужно будет использовать 'df [is.na (df)] <-" foo "' –

57

Один из способов пресечь это в зародыше, чтобы преобразовать этот символ NA, когда вы читаете данные в первую очередь.

df <- read.csv("file.csv", na.strings = c("foo", "bar")) 
0

Один альтернативный способ решения ниже:

for (i in 1:ncol(DF)){ 
    DF[which(DF[,i]==""),columnIndex]<-"ALL" 
    FinalData[which(is.na(FinalData[,columnIndex])),columnIndex]<-"ALL" 
} 
2

Другой вариант is.na<-:

is.na(df) <- df == "foo" 

Обратите внимание, что его использование может показаться немного нелогичным, но на самом деле присваиваетNA значениям df по указателю с правой стороны.

+1

или тот же '' is.na <- '(df, df == "foo") ' – jogo

0

Это может быть сделано с dplyr «s mutate_all и replace:

library(dplyr) 
df <- data_frame(a = c('foo', 2, 3), b = c(1, 'foo', 3), c = c(1,2,'foobar'), d = c(1, 2, 3)) 

> df 
# A tibble: 3 x 4 
    a  b  c  d 
    <chr> <chr> <chr> <dbl> 
1 foo  1  1  1 
2  2 foo  2  2 
3  3  3 foobar  3 


df <- mutate_all(df, funs(replace(., .=='foo', NA))) 

> df 
# A tibble: 3 x 4 
     a  b  c  d 
    <chr> <chr> <chr> <dbl> 
1 <NA>  1  1  1 
2  2 <NA>  2  2 
3  3  3 foobar  3 
Смежные вопросы