Ответ 1
Прочитав файл csv, попробуйте следующее. Он заменит значения NA на "".
b[is.na(b)]<-""
Достаточно уверен, что не будет фиксировать ваши значения NaN. Это нужно будет решить в отдельном заявлении
b[is.nan(b)]<-""
У меня есть текстовый файл с разделителями табуляции с именем "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="", )
Подводя итог: я хочу реплицировать те же значения в выходном файле, не изменяя их:
Прочитав файл csv, попробуйте следующее. Он заменит значения NA на "".
b[is.na(b)]<-""
Достаточно уверен, что не будет фиксировать ваши значения NaN. Это нужно будет решить в отдельном заявлении
b[is.nan(b)]<-""
Значение по умолчанию для 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
Вы можете указать colClasses
в инструкции read.csv
, чтобы прочитать столбец как текст.
Используйте аргумент na.string.
na.string используется для определения того, какие аргументы должны считываться как значение na из данных. Поэтому, если вы отметите
read.csv(text=bt, na.string = "abc")
тогда где когда-либо в ваших данных он будет abc, он преобразует его в na.
Поскольку abc не найден в ваших данных, он не преобразует какое-либо значение в na.