R: Как заменить элементы data.frame? - PullRequest
13 голосов
/ 04 мая 2010

Я пытаюсь заменить элементы 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*, список, значение = "NULL"): новые столбцы оставят дыры после существующих столбцов

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

Ответы [ 3 ]

19 голосов
/ 04 мая 2010

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

12 голосов
/ 28 мая 2010

Почему бы не

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


Вам не нужно менять свой фрейм данных

1 голос
/ 04 мая 2010

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

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

Редактировать

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...