Чтение csv с неопределенными конечными пробелами после значений NA - PullRequest
0 голосов
/ 26 марта 2020

У меня есть набор CSV-файлов, где пропущенные значения (NA) сопровождаются переменным количеством пробелов по всему файлу.

Как лучше всего правильно интерпретировать эти значения как NA, а не как символы?

Ниже приведен пример данных, с которыми я имею дело и что я пробовал. Использование регулярных выражений в аргументах na.strings, похоже, не работает.

Обратите внимание, что пробелы всегда заканчиваются - если это поможет!

x = data.frame(id = 1:5, missing = c(NA, "NA ", "NA  ", "NA    ", "NA                "), 
               stringsAsFactors = FALSE)
write.csv(x, 'NA_test.csv')

read.csv('NA_test.csv', na.strings = c("NA[[:space:]]+"), header = TRUE, stringsAsFactors = FALSE)

Ответы [ 3 ]

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

read.csv игнорирует некоторые аргументы, поэтому вы должны использовать read.table. К сожалению, na.string не оценивает регулярное выражение. Кроме того, strip.white = TRUE удаляет только пробелы из строк без кавычек . Это лучшее, что вы могли бы сделать, используя read.table.

read.table('~/NA_test.csv', header = TRUE, sep = ",", na.strings = c(NA, "NA ", "NA  ", "NA    ", "NA                "), stringsAsFactors = FALSE)
  id missing
1  1      NA
2  2      NA
3  3      NA
4  4      NA
5  5      NA
0 голосов
/ 26 марта 2020

Re: @Ian Campbells comments

Похоже, что лучшее решение - просто просмотреть каждую ячейку для поиска NA после загрузки. Это то, что я буду использовать.

x = data.frame(id = 1:5, missing = c(NA, "NA ", "NA  ", "NA    ", "NA                "), 
               stringsAsFactors = FALSE)
write.csv(x, 'NA_test.csv', row.names = FALSE)

y = read.csv('NA_test.csv', header = TRUE, stringsAsFactors = FALSE)
apply(y, 2, function(x) gsub("NA[[:space:]]+", NA, x))
0 голосов
/ 26 марта 2020

Возможно есть лучшие решения, но вот мой go. Я просто удаляю все пробелы с помощью команды regex и нахожу, что это NA. As.data.frame с sapply должен хранить все классы переменных.

y <- read.csv('NA_test.csv', header = TRUE, stringsAsFactors = FALSE)
y

findNA <- function(x) {
  if (class(x) == 'character') {
    temp <- gsub(' ', '', x) 
    return(replace(temp, temp == 'NA', NA))
  } else { 
    return(x)  
  }
}

as.data.frame(sapply(y, findNA, simplify = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...