10

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

3 回答 3

10

稍微修改了 BondedDust版本,因为 setnames 函数不与 <- 符号一起使用:

setnames(DT, make.names(colnames(DT))
于 2014-07-08T14:44:08.087 回答
6

在列名中获得前导空格应该是相当困难的。不应通过“随意编码”发生。另一方面,我在fread代码中没有看到太多的错误检查,所以也许直到这个不良行为得到修复,(或功能请求被拒绝),你可以做这样的事情:

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

另一方面,如果您对colnames(DT)使用引号显示列名这一事实感到困扰,那么只需“克服它”即可。这就是交互式控制台显示任何字符值的方式。

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

于 2013-06-06T18:02:30.483 回答
1

您可以在 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.
于 2017-08-31T06:37:33.227 回答