read.xlsx и colClasses
Кто-нибудь знает, почему аргумент colClasses
не похоже на работу в read.xlsx
?
Я создаю образец *.xlsx файла:
> library(xlsx)
> d1 = data.frame(A=LETTERS[1:3], B=letters[1:3], C=1:3, D=c(1.1, NA, NA))
> str(d1)
'data.frame': 3 obs. of 4 variables:
$ A: Factor w/ 3 levels "A","B","C": 1 2 3
$ B: Factor w/ 3 levels "a","b","c": 1 2 3
$ C: int 1 2 3
$ D: num 1.1 NA NA
> write.xlsx(d1, 'test.xlsx', sheetName='Sheet1', row.names=F, showNA=F)
затем попробуйте прочитать это с read.xlsx
без и с colClasses
аргумент:
> d2 = read.xlsx('test.xlsx', sheetName='Sheet1')
> str(d2)
'data.frame': 3 obs. of 4 variables:
$ A: Factor w/ 3 levels "A","B","C": 1 2 3
$ B: Factor w/ 3 levels "a","b","c": 1 2 3
$ C: num 1 2 3
$ D: num 1.1 NA NA
> d2 = read.xlsx('test.xlsx', sheetName='Sheet1', colClasses=c(B='character', 'A'='character'))
> str(d2)
'data.frame': 3 obs. of 4 variables:
$ A: Factor w/ 3 levels "A","B","C": 1 2 3
$ B: Factor w/ 3 levels "a","b","c": 1 2 3
$ C: num 1 2 3
$ D: num 1.1 NA NA
Проблема в colClasses
кажется, не имеет никакого эффекта. Есть идеи?
Спасибо за помощь.
Алексей
PS у меня R 3.0.1, xlsx
0.5.1
1 ответ
Решение
colClasses=
работает, но проблема в том, что в вашей системе действие по умолчанию при импорте данных заключается в преобразовании символьных столбцов в фактор.
Если вы импортируете test.xlsx
и установите, что все столбцы должны быть "character"
Вы видите, что все столбцы сделаны как факторы (также числа).
d2 = read.xlsx('test.xlsx', sheetName='Sheet1', colClasses=rep("character",4))
str(d2)
'data.frame': 3 obs. of 4 variables:
$ A: Factor w/ 3 levels "A","B","C": 1 2 3
$ B: Factor w/ 3 levels "a","b","c": 1 2 3
$ C: Factor w/ 3 levels "1","2","3": 1 2 3
$ D: Factor w/ 1 level "1.1": 1 NA NA
Чтобы гарантировать, что символы не преобразуются в факторы, вы можете добавить аргумент stringsAsFactors=FALSE
функционировать read.xlsx()
,
d2 = read.xlsx('test.xlsx', sheetName='Sheet1',
colClasses=c(B='character', A='character'),stringsAsFactors=FALSE)
str(d2)
'data.frame': 3 obs. of 4 variables:
$ A: chr "A" "B" "C"
$ B: chr "a" "b" "c"
$ C: num 1 2 3
$ D: num 1.1 NA NA