R:读取包含在csv引号中的数值

时间:2016-02-24 14:49:03

标签: r csv quotes read.table

这可能很容易,但我似乎无法弄明白。

我有一个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)

2 个答案:

答案 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)`