当列名包含空格和特殊字符时,从data.table包中读取?

时间:2013-06-06 16:08:12

标签: r csv data.table special-characters fread

我有一个csv文件,其中列名包含空格和特殊字符。

fread使用引号导入它们 - 但是如何更改此行为?一个原因是我的列名以空格开头,我不知道如何处理它们。

任何指针都会有所帮助。

编辑:一个例子。

> packageVersion("data.table")
[1] ‘1.8.8’

p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE)

> head(p2p[,list(Principal remaining)])
Error: unexpected symbol in "head(p2p[,list(Principal remaining"

> head(p2p[,list("Principal remaining")])
                    V1
1: Principal remaining

> head(p2p[,list(c("Principal remaining"))])
                    V1
1: Principal remaining

我期待/想要的当然是没有空格的列名称:

> head(p2p[,list(Principal)])
   Principal
1:      1000
2:      1000
3:      1000
4:      2000
5:      1000
6:      4130

3 个答案:

答案 0 :(得分:9)

稍微修改了 BondedDust 版本,因为setnames函数不与&lt; - sign:

一起使用
setnames(DT, make.names(colnames(DT))

答案 1 :(得分:5)

在列名中获取前导空格应该相当困难。不应该通过“随意编码”来实现。另一方面,我没有在fread代码中看到非常多的错误检查,所以可能直到修复了这种不良行为(或功能请求被拒绝),你可以这样做:

setnames(DT, make.names(colnames(DT))) 

另一方面,如果colnames(DT)将显示带引号的列名,那么你会感到困扰,那么只需“克服它”。这就是交互式控制台将显示任何字符值的方式。

如果原始字符列中的数据项看起来像" ttt",则导入时会有前导空格,您需要使用colnames(dfrm) <- sub("^\\s+", "", colnames(dfrm))或其中一个处理它各种包中的几个trim函数(例如'gdata')

答案 2 :(得分:0)

您可以在data.table

的fread函数中使用参数check.names = T.
p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE, check.names=T)

它在后台使用make.names函数

default is FALSE. If TRUE then the names of the variables in the data.table 
are checked to ensure that they are syntactically valid variable names. If 
necessary they are adjusted (by make.names) so that they are, and also to 
ensure that there are no duplicates.