【发布时间】:2015-02-10 11:55:37
【问题描述】:
我有 data.frames 的字符列包含数字(如“0123”、“1234”等)。当我将它们写入 csv 并将它们读回时,它们最终成为数字列。 write.csv 和 read.csv 函数有 quote 参数,默认情况下应该在输出时引用字符串并在输入时尊重它们,所以这种行为是意料之外的。
当我重新读入文件时,如果不手动指定colClasses,如何避免这种情况?
可重现的例子:
# dummy data
fake_data <-
data.frame(num=1:25, char=letters[1:25], charnum=as.character(1:25),
stringsAsFactors=F)
# check out col classes - all good
sapply(fake_data, class)
# num char charnum
# "integer" "character" "character"
# write it to a file and read it back
fpath <- '~/Desktop/fake_data.csv'
write.csv(fake_data, fpath, row.names=F)
fake_data2 <- read.csv(fpath, stringsAsFactors=F)
# but now look, different classes!
sapply(fake_data2, class)
# num char charnum
# "integer" "character" "integer"
似乎错误在读取端,因为文件是用引号写入的。
> cat(readLines(fpath))
"num","char","charnum" 1,"a","1" 2,"b","2" 3,"c","3" 4,"d","4" 5,"e","5" 6,"f","6" 7,"g","7" 8,"h","8" 9,"i","9" 10,"j","10" 11,"k","11" 12,"l","12" 13,"m","13" 14,"n","14" 15,"o","15" 16,"p","16" 17,"q","17" 18,"r","18" 19,"s","19" 20,"t","20" 21,"u","21" 22,"v","22" 23,"w","23" 24,"x","24" 25,"y","25"
会话信息:
R 版本 3.1.1 (2014-07-10) |平台:x86_64-apple-darwin13.1.0(64位)
【问题讨论】:
-
这个问题 (stackoverflow.com/questions/22923756/…) 密切相关,但很少受到关注,并且没有发布适用于我的问题的解决方案,如所述;我不能将所有 colClasses 指定为字符,因为我有一些数字字段
-
@user20650,真的吗? read.csv 调用 read.table。当我运行
read.table(fpath, header=T, sep=',', stringsAsFactors=F)时,我遇到了同样的问题 -
@arvi1000;是的,你说得对