R: Как заменить элементы data.frame?

Я пытаюсь заменить элементы data.frame, содержащие "# N/A" с "NULL", и у меня возникают проблемы:

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8))

indices_of_NAs <- which(foo == "#N/A") 

replace(foo, indices_of_NAs, "NULL")

Ошибка в [<-.data.frame (*tmp*, list, value = "NULL" ): новые столбцы оставят дыры после существующих столбцов

Я думаю, что проблема в том, что мой индекс обрабатывает data.frame как вектор, но что функция replace обрабатывает его по-разному, но я не уверен, в чем проблема?

Ответ 1

NULL действительно означает "ничего", а не "отсутствует", поэтому он не может заменить фактическое значение - для отсутствия R используется NA.

Вы можете использовать метод замены is.na для непосредственного обновления выбранных элементов, это будет работать с логическим результатом. (Использование для индексов будет работать только с is.na, прямое использование [вызывает список доступа, который является причиной вашей ошибки).

foo <- data.frame("day"= c(1, 3, 5, 7), "od" = c(0.1, "#N/A", 0.4, 0.8)) 
NAs <- foo == "#N/A"

## by replace method
is.na(foo)[NAs] <- TRUE

 ## or directly
 foo[NAs] <- NA

Но вы уже имеете дело со строками (фактически по умолчанию) в столбце od принудительным принуждением, когда оно было создано с помощью c(), и вам может понадобиться обрабатывать столбцы по отдельности. Например, любой числовой столбец никогда не будет соответствовать строке "# N/A".

Ответ 2

Почему бы не

x$col[is.na(x$col)]<-value

?
Вам не придется менять свой фреймворк

Ответ 3

Функция замены ожидает вектор, и вы поставляете data.frame.

Вы действительно должны попытаться использовать NA и NULL вместо значений символов, которые вы используете в настоящее время. В противном случае вы не сможете воспользоваться всеми функциональными возможностями R для обработки отсутствующих значений.

Изменить

Вы можете использовать функцию apply или сделать что-то вроде этого:

foo <- data.frame(day= c(1, 3, 5, 7), od = c(0.1, NA, 0.4, 0.8))
idx <- which(is.na(foo), arr.ind=TRUE)
foo[idx[1], idx[2]] <- "NULL"

В этом случае невозможно присвоить реальное значение NULL, так как оно имеет нулевую длину. Важно понимать разницу между NA и NULL, поэтому я рекомендую вам читать ?NA и ?NULL.