Позднее редактирование: перечитав это после правок и расширенных комментариев, мне интересно, было ли то, что было необходимо (или, по крайней мере, запрошено), было в значительной степени полной противоположностью тому, что я советую ниже. Запрос на это:
К сожалению, 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