Я пытаюсь заменить элементы data.frame, содержащего "#N/A" с "ПУСТЫМ УКАЗАТЕЛЕМ", и я сталкиваюсь с проблемами:
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*
, список, значение = "ПУСТОЙ УКАЗАТЕЛЬ"): новые столбцы покинули бы дыры после существующих столбцов
Я думаю, что проблема состоит в том, что мой индекс рассматривает data.frame как вектор, но что функция замены рассматривает его по-другому так или иначе, но я не уверен, какова проблема?
NULL на самом деле означает "ничего", а не "отсутствует", поэтому он не может занять место фактического значения - для отсутствующего значения R использует NA.
Вы можете использовать метод замены is.na для прямого обновления выбранных элементов, это будет работать с логическим результатом. (Использование which для индексов будет работать только с 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", например.
Функция replace ожидает вектор, а вы предоставляете data.frame.
Вам действительно стоит попробовать использовать NA
и NULL
вместо значений символов, которые вы используете в настоящее время. В противном случае вы не сможете воспользоваться всеми функциями R для обработки пропущенных значений.
Edit
Вы можете использовать функцию 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
.
Почему не
x$col[is.na(x$col)]<-value
?
Вам не придется менять фрейм данных