这可能很容易,但我似乎无法弄明白。
我有一个csv文件,所有条目都用引号括起来,也就是数字值,比如这个,比如xy.csv
:
"y","z"
"1.1","bla"
"2.1","blubb"
到目前为止,我一直在阅读并使用
重新声明这些文件dat <- read.table("yz.csv",colClasses=rep("character",2), header=TRUE)
dat$y <- as.numeric(dat$y)
现在随着数字列数量的增加,如qz.csv
"q","r","s","t","u","v","w","x","y","z"
"1.1","1.2","1.3","1.4","1.5","1.6","1.7","1.8","1.9","bla"
"2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","blubb"
我觉得是时候更专业地做这件事以防止发生以下情况
dat <- read.table("qz.csv",colClasses=rep("character",10), header=TRUE)
dat$q <- as.numeric(dat$a)
dat$r <- as.numeric(dat$b)
...
dat$y <- as.numeric(dat$y)
有没有办法让read.table函数忽略数字周围的引号,所以我可以使用
dat <- read.table("qz.csv",colClasses=c(rep("numeric",9),"character"), header=TRUE)
目前给我的错误是scan() expected 'a real', got '"1.2"'
?
编辑:这是原始的file,这是我用于原件的代码,它给了我错误:
doc <- read.csv("testfile.csv", collClasses=c("character","character",rep("NULL",50),rep("numeric",7),"NULL","NULL"), col.names=c("country","code",rep("bla",50),"doc08","doc09","doc10","doc11","doc12","doc13","doc14","bla","bla"), skip=4, check.names=F, header=T)
答案 0 :(得分:2)
更新以显示最小的例子......我无法弄明白。我也试过了readr
包......
a <- textConnection('"A", "B", "C"
"a", "1", "1"
"b", "2", "2"')
df <- read.csv(a, colClasses=c("character", "NULL", "numeric"),
col.names=c("AA", "BB", "CC"))
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
scan() expected 'a real', got '"1"'
library("readr")
> df <- read_csv(a, col_types=c("c", "-", "n"),
+ col_names=c("AA", "BB", "CC"))
Error in names(spec$cols) <- col_names :
'names' attribute [3] must be the same length as the vector [2]
In addition: Warning message:
Insufficient `col_types`. Guessing 2 columns.
答案 1 :(得分:0)
我认为最好的办法是在colClasses中为数字列使用NA:
dat <- read.table("qz.csv",colClasses=c(rep(NA,9),"character"), header=TRUE)
然后type.convert()将识别数字数据并进行转换。或者,为了减少读取后转换列的混乱,您可以执行类似
的操作dat <- read.table("qz.csv",colClasses=rep("character",10), header=TRUE)
dat[,1:9] <- lapply(dat[,1:9], as.numeric)`