пустые поля read.csv для NA

У меня есть текстовый файл с разделителями табуляции с именем «a.txt». Столбец D пуст.

 A       B       C    D
10      20     NaN
30              40
40      30      20
20      NA      20

Я хочу, чтобы фрейм данных выглядел и действовал точно так же, как текстовый файл, с пробелом во 2-й строке и во 2-м столбце.

К сожалению, read.csv преобразует все пробелы и NA в «NA». Я хочу читать NA и NaN как символы.

 b<- read.csv("a.txt",sep="\t", skip =0, header = TRUE, comment.char = "",check.names = FALSE, quote="", )

Подводя итог: я хочу воспроизвести одни и те же значения в выходном файле без их изменения:

  • Если на входе есть пробел, вывод должен быть пустым.
  • Если на входе есть NA или Nan, то на выходе также должно быть NA или NaN.

person user1631306    schedule 01.10.2013    source источник


Ответы (4)


После прочтения CSV-файла попробуйте следующее. Он заменит значения NA на "".

b[is.na(b)]<-""

Совершенно уверен, что это не исправит ваши значения NaN. Это нужно будет решить в отдельном заявлении

b[is.nan(b)]<-""
person silly_penguin    schedule 01.10.2013
comment
Это преобразует все столбцы в строковые переменные. Затем второй не исправит NaN, потому что все столбцы b будут строками после использования первого. - person Brian Diggs; 02.10.2013
comment
Это преобразует текущие значения NA и NaN в .. Я не смогу их вернуть. Мне нужно сохранить NA, NaN и пустые значения. - person user1631306; 02.10.2013
comment
Нет. Это превратит их всех в NA. - person IRTFM; 02.10.2013

Позднее редактирование: перечитав это после правок и расширенных комментариев, мне интересно, было ли то, что было необходимо (или, по крайней мере, запрошено), было в значительной степени полной противоположностью тому, что я советую ниже. Запрос на это:

К сожалению, read.csv преобразует все пробелы и NA в «NA». Я хочу читать NA и NaN как символы.

,,, могли бы удовлетвориться (несколько парадоксально) аргументами: colClasses="character", stringsAsFactors=FALSE, na.strings="."`

Then any character value including an empty string would come in as itself. Arguing against this is the acceptance of the answer that converts empty character values ("") to R _NA_character значений.

Вот тестовый пример с различными результатами:

 sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings=""), class )
#        A         B         C         D 
# "factor" "logical"  "factor" "numeric" 
 sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings="x"), class )
#        A         B         C         D 
# "factor" "logical"  "factor" "numeric" 
 sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings="x", stringsAsFactors=FALSE), class )
#          A           B           C           D 
#"character"   "logical" "character"   "numeric" 

#Almost the expressed desired result
 sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', #colClasses="character", stringsAsFactors=FALSE), class )
#          A           B           C           D 
#"character" "character" "character" "character" 
#But ... still get a real R <NA>
read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', colClasses="character", stringsAsFactors=FALSE)
#  A B    C   D
#1 a   <NA> NaN
#So add all three
 read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', colClasses="character", stringsAsFactors=FALSE,na.strings=".")
#  A B  C   D
#1 a   NA NaN
# Finally all columns are character and no "real" R NA's

По умолчанию для na.strings просто «NA», поэтому вам, возможно, нужно добавить «NaN». Истинные пробелы ("") устанавливаются как отсутствующие, а пробелы ("") — нет:

 b<- read.csv("a.txt",  skip =0,  
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

Неясно, в чем проблема, поскольку ваш пример данных искажен и не имеет запятых. Это может быть основной проблемой, поскольку read.csv не допускает разделения табуляцией. Используйте read.delim или read.table, если ваши данные разделены табуляцией.

b<- read.table("a.txt", sep="\t" skip =0, header = TRUE, 
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

# worked example for csv text file connection
 bt <- "A,B,C  
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") )
 b
#--------------
   A  B  C
1 10 20 NA
2 30 NA 40
3 40 30 20
4 NA NA 20

Пример 2:

bt <- "A,B,C,D
10,20,NaN
30,,40
40,30,20
,NA,20"

 b<- read.csv(text=bt, sep=",", 
                comment.char = "",check.names = FALSE, quote="\"",
                na.strings=c("NA","NaN", " ") , colClasses=c(rep("numeric", 3), "logical")) 
 b
#----------------
   A  B  C  D
1 10 20 NA NA
2 30 NA 40 NA
3 40 30 20 NA
4 NA NA 20 NA
> str(b)
'data.frame':   4 obs. of  4 variables:
 $ A: num  10 30 40 NA
 $ B: num  20 NA 30 NA
 $ C: num  NA 40 20 20
 $ D: logi  NA NA NA NA

Немного интересно, что NA и NaN не идентичны для числовых векторов. NaN возвращается операциями, которые не имеют математического смысла (но, как отмечено на странице справки, которую вы получаете с помощью ?NaN, результаты операций могут зависеть от конкретной ОС. Проверка равенства не подходит ни для NaN, ни для NA. Существуют определенные is функции для них:

> Inf*0
[1] NaN

> is.nan(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE FALSE
> is.na(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE  TRUE  TRUE  # note the difference
person IRTFM    schedule 01.10.2013
comment
Это преобразует текущие значения NA и NaN в .. Я не смогу их вернуть. Мне нужно сохранить NA, NaN и пустые значения. - person user1631306; 02.10.2013
comment
Я больше копаюсь в своих данных... Столбец D совершенно пуст, с логическим классом. \ - person user1631306; 02.10.2013
comment
Как что-то может быть совершенно пустым с логикой класса? ПОЖАЛУЙСТА, ОСТАВЬТЕ СВОИ ДАННЫЕ. Вы не показали нам, как выглядит текстовый файл, и, возможно, показываете нам, какой вывод на экран вы видите.... это не одно и то же. - person IRTFM; 02.10.2013
comment
Столбец D пуст. Если вы выполните sapply(b,class).. вы получите A B C D целое целое числовое логическое - person user1631306; 02.10.2013
comment
Вы по-прежнему не сообщаете нам, как выглядит ваш файл данных. Я могу сделать пустой логический столбец, если использую colClasses › См. выше. - person IRTFM; 02.10.2013
comment
Как я могу опубликовать свой файл как вложение? - person user1631306; 02.10.2013
comment
Откройте его в текстовом редакторе и вставьте в свой вопрос. (НЕ в комнет.) - person IRTFM; 02.10.2013
comment
давайте продолжим это обсуждение в чате - person user1631306; 02.10.2013
comment
b<- read.csv("a.txt", skip =0, comment.char = "",check.names = FALSE, quote="", na.strings=c("NA","NaN", " ") ) Пустые поля, чтобы быть NA, вам просто нужны кавычки без пробелов. Из того, что я читал, он хочет отделить NaN от NA, что неясно с его вопросом. na.strings = c("NA", "NaN", "")) - person mtelesha; 28.01.2015

Вы можете указать colClasses в операторе read.csv, чтобы прочитать столбец как текст.

person TheComeOnMan    schedule 01.10.2013
comment
Это неправильно. colClasses здесь не поможет. Или, может быть, точнее, я думаю, есть более подходящий аргумент. - person joran; 02.10.2013
comment
Очень загадочно... stringsAsFactors=FALSE? - person beroe; 02.10.2013
comment
Я не понимаю. Когда ОП говорит, что он / она хочет, чтобы фрейм данных был точно таким же, как текстовый файл, имеют ли они в виду, что мы должны получить три столбца с пробелом, NA и NaN в качестве трех записей, как показано в вопросе? - person TheComeOnMan; 02.10.2013
comment
Я согласен, что вопрос ОП немного неясен. Моя единственная точка зрения заключалась в том, что, как указывает DWin, аргумент na.strings здесь кажется более вероятным, чем colClasses. - person joran; 02.10.2013
comment
Что я имел в виду, если я пишу b в текстовый файл, он должен быть точно таким же, как входной t.txt,, с пробелами... не вновь введенный Na - person user1631306; 02.10.2013
comment
установка colClasses=character сработала, но она заменяет все на строку, даже числовую часть, что ограничивает расчетную часть - person user1631306; 02.10.2013
comment
Давайте сделаем шаг назад, почему вам нужно рассматривать пробелы как отличные от NA? Если вы собираетесь записать b как csv, возможно, вы можете сохранить копию со всеми столбцами, прочитанными как текст, и иметь временный набор данных, в котором вы преобразуете необходимые столбцы в числовые. Как вы можете видеть в большинстве ответов и комментариев, никто не уверен, что именно вы пытаетесь сделать. Это поможет, если вы сделаете свой вопрос более ясным. - person TheComeOnMan; 02.10.2013
comment
Извините за путаницу .. У меня есть файл с одним пустым столбцом, некоторые столбцы с Na и NaN. Я делаю некоторые вычисления в этом файле и записываю его в новые файлы, добавляя несколько столбцов. Но пустой столбец там больше не пуст, его NA.. То, что я хочу, это точно такой же формат файла в моем выходном файле . - person user1631306; 02.10.2013
comment
Извините, я все еще не совсем понимаю вашу проблему. Это будет мой последний ответ на этот вопрос - прочитать все столбцы как текст в b. Сделайте копию b и преобразуйте столбцы в числовые в этой копии. Запустите свои расчеты на копии. Если вам нужно обновить b перед повторной записью, обновите определенные столбцы (например, b$A ‹- что-то), а не весь набор данных (т. е. не b ‹- что-то), оставив D нетронутым. Используйте write.csv (вместе с аргументом na, если необходимо). - person TheComeOnMan; 02.10.2013

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

read.csv(text=bt, na.string = "abc")

затем всякий раз, когда в ваших данных встречается значение «abc», оно преобразует его в na.
Поскольку «abc» не найдено в ваших данных, оно не будет преобразовывать какое-либо значение в na.

person Karan    schedule 07.08.2016