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

Я пытаюсь заменить элементы 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 как вектор, но что функция замены рассматривает его по-другому так или иначе, но я не уверен, какова проблема?

13
задан John 4 May 2010 в 16:47
поделиться

3 ответа

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", например.

19
ответ дан 1 December 2019 в 20:00
поделиться

Функция 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 .

1
ответ дан 1 December 2019 в 20:00
поделиться

Почему не

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

?
Вам не придется менять фрейм данных

12
ответ дан 1 December 2019 в 20:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: