read.xlsx and colClasses

7
有人知道为什么在使用read.xlsx时,参数colClasses似乎不起作用吗?
我创建了一个示例*.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似乎没有效果。有什么想法吗?
谢谢您的帮助。
Aleksey
附注:我使用的是R 3.0.1版本,xlsx 0.5.1版本。
1个回答

14

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
为了确保字符不被转换为因子,您可以在函数read.xlsx()中添加参数stringsAsFactors=FALSE
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

Didzis,谢谢,这个很好用。我忘记了stringsAsFactors会进行第二次转换,将字符向量转换为因子。谢谢你,对于这个问题我忘记了这么长时间,很抱歉。 - user2690051
@Didzis Elferts,stringsAsFactors=FALSEread.xlsx中不起作用。我不确定它是否与其版本有关。我正在使用openxlsx版本4.2.5 - Mehmet Yildirim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接