У меня есть фрейм данных, в котором иногда бывают -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
. Я просто не знаю, как заменить значение.
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
, и преобразование будет выполнено за вас по мере считывания данных.
Вы можете сделать это быстро и прозрачно с помощью библиотеки 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
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.
d[d == -1] <- NA