найти и заменить строку 'NA' на NA, когда присутствует столбец типа даты - PullRequest
4 голосов
/ 10 марта 2020

Я хочу найти во всех столбцах 'NA' и заменить на NA, но при наличии столбца даты возникают проблемы:

library(lubridate)
x = data.frame(a = c('NA', NA), b = c(today(), today()))
x[x == 'NA'] = NA

возвращает ошибку:

Error in charToDate(x) : 
  character string is not in a standard unambiguous format

Как мне от этого избавиться? Я знаю имена столбцов без даты, пытался сделать что-то вроде

col = 'a'
x[x == 'NA', col] = NA 

, но получил ту же ошибку.

Ответы [ 4 ]

2 голосов
/ 10 марта 2020

Ошибка возникает из-за того, что столбец b является типом даты и «NA» не может интерпретироваться как дата

x$b == "NA"
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

Код x == "NA" проходит через оба столбца кадра данных. Попробуйте: x$a[x$a == 'NA'] = NA

1 голос
/ 11 марта 2020

Если мы уже знаем столбцы, которые мы хотим изменить, мы можем задать для этих столбцов подмножество, отметьте «NA» и замените их на NA, например:

x[col][x[col] == 'NA'] <- NA
x

#     a          b
#1 <NA> 2020-03-11
#2 <NA> 2020-03-11

Или быть очень точным c:

x[col][x[col] == 'NA' & !is.na(x[col])] <- NA
1 голос
/ 10 марта 2020

Может быть, вы можете попробовать replace, как показано ниже

x$a <- replace(x$a,which(x$a=="NA"),NA)

, чтобы

> x
     a          b
1 <NA> 2020-03-10
2 <NA> 2020-03-10

ДАННЫЕ

x <- structure(list(a = structure(c(NA_integer_, NA_integer_), .Label = "NA", class = "factor"), 
    b = structure(c(18331, 18331), class = "Date")), row.names = c(NA, 
-2L), class = "data.frame")
0 голосов
/ 10 марта 2020

Кажется, это работает с вашим представителем:

na_func <- function(x) gsub('NA', NA,x)
x[1] <- as.data.frame(lapply(x[1], na_func))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...