Подтвердить что ты не робот

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

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

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

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

К сожалению, 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.
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Значение по умолчанию для 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

Ответ 3

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

Ответ 4

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

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

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