当列名包含空格和特殊字符时,如何使用data.table包中的fread函数?

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
3个回答

10
稍微修改了一下 BondedDust 的版本,因为 setnames 函数没有使用 <- 符号:
setnames(DT, make.names(colnames(DT))

不错。David Arenburg修复了它。我感到相当尴尬,惊讶于这个错误持续了一年多。 - IRTFM

6

在列名中获得前导空格可能相当困难。不应该通过“随意编码”发生这种情况。另一方面,我没有看到fread代码中有很多错误检查,因此,可能在修复此不良行为(或拒绝功能请求)之前,您可以执行以下操作:

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

另一方面,如果您被colnames(DT)在显示列名时添加引号所困扰,那就"不要纠结了"。这是交互式控制台将显示任何字符值的方式。

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


我会尝试使用sub/gsub方法。谢谢。 - Rico
你可能需要更新你的回答。警告信息: 在names<-.data.table(tmp,value = value)中: colnames(x)<-value语法复制整个表格。这是由于R本身中的<-。请更改为setnames(x,old,new),它不会复制并且更快。请参阅help('setnames')。如果现在更改不方便,您可以安全地忽略此警告。设置options(warn = 2)将此警告转换为错误,因此您可以使用traceback()查找和更改您的colnames <-调用。 - Rico
我创建了一个解决方法,即现在使用这个函数。clean.names <- function(x) { y <- str_trim(colnames(x)) y <- gsub("\\s", ".", y) y <- str_replace_all(y, "[[:punct:]]", ".") y <- tolower(y) return(y) } - Rico
也许我们可以放弃 stringr 包,然后就可以得到答案了。从 @matthew-dowle 那里得到评论会很有趣。 - Rico
你似乎在基础R中重新发明make.names。如果担心make.names无法处理名称中的前导或尾随空格,那么只需传递:sub("^\\s+|\\s+$", "", colnames(m)) - IRTFM
啊,好观点,没意识到。不过,make.names非常通用,包括大写字母和下划线等符号。 - Rico

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接