У меня есть фрейм данных, в котором иногда бывают -1. Я хочу заменить их на NA. Я попробовал функцию apply, но она возвращает мне матрицу символов, что не годится:

 apply(d,c(1,2), function(x){
   if (x == -1){
      return (NA)
   }else{
      return (x)
   }
 })

Я борюсь с by, но, похоже, не могу справиться с этим должным образом. У меня пока есть это:

 s <-by(d,d[,'Q1_I1'], function(x){
     for(i in x)
        print(i)
})

Который, если я правильно понял, by() входит в x мой фрейм данных построчно. И я могу перебирать каждый элемент строки с помощью функции for. Я просто не знаю, как заменить значение.

r
3
Pio 22 Мар 2014 в 17:31
8
d[d == -1] <- NA
 – 
rawr
22 Мар 2014 в 17:37

2 ответа

Лучший ответ

Причина того, что apply не работает, заключается в том, что он преобразует фрейм данных в матрицу, и если ваш фрейм данных содержит какие-либо факторы, то это будет символьная матрица.

Вместо этого вы можете использовать lapply, который будет обрабатывать фрейм данных по одному столбцу за раз. Этот код работает:

mydf <- data.frame( x=c(1:10, -1), y=c(-1, 10:1), g=sample(letters,11) )
mydf
mydf[] <- lapply(mydf, function(x) { x[x==-1] <- NA; x})
mydf

Как отмечает @rawr в комментариях, он действительно работает:

mydf[ mydf== -1 ] <- NA

Но в документации (?'[.data.frame') сказано, что это не рекомендуется из-за преобразований.

Один большой вопрос - как создается фрейм данных. Если вы читаете данные с помощью read.table или связанных функций, вы можете просто указать аргумент na.strings, и преобразование будет выполнено за вас по мере считывания данных.

1
Greg Snow 22 Мар 2014 в 21:24

Вы можете сделать это быстро и прозрачно с помощью библиотеки data.table.

# take standard dataset and transform to data.table
mtcars = data.table(mtcars,keep.rownames = TRUE)

# select rows with 5 gear and set to NA
mtcars[gear==5,gear:= NA]
mtcars
1
Henk 22 Мар 2014 в 18:07