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

Posted

技术标签:

【中文标题】当列名包含空格和特殊字符时从 data.table 包中读取?【英文标题】:fread from data.table package when column names include spaces and special characters? 【发布时间】:2013-06-02 17:58:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

我会试试 sub/gsub 路线。谢谢。 你可能想用这个来更新你的答案。 Warning message: In names&lt;-.data.table(*tmp*, value = value) : The colnames(x)&lt;-value syntax copies the whole table. This is due to &lt;- in R itself. Please change to setnames(x,old,new) which does not copy and is faster. See help('setnames'). You can safely ignore this warning if it is inconvenient to change right now. Setting options(warn=2) turns this warning into an error, so you can then use traceback() to find and change your colnames&lt;- calls. 我创建了一个解决方法,即现在使用此功能。 clean.names &lt;- function(x) y &lt;- str_trim(colnames(x)) y &lt;- gsub("\\s", ".", y) y &lt;- str_replace_all(y, "[[:punct:]]", ".") y &lt;- tolower(y) return(y) 也许我们摆脱了stringr 包,然后它就可以得到答案了。从@matthew-dowle 获得评论会很有趣 您似乎在基础 R 中重新发明 make.names。如果担心 make.names 不会根据您的喜好处理名称中的前导或尾随空格,那么只需传递它:sub("^\\s+|\\s+$", "", colnames(m))【参考方案2】:

BondedDust 版本稍作修改,因为 setnames 函数没有与

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

【讨论】:

好一个。大卫·阿伦堡修好了。我很尴尬,我这样做了,并且惊讶于错误持续了一年多。【参考方案3】:

您可以在 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.

【讨论】:

以上是关于当列名包含空格和特殊字符时从 data.table 包中读取?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 的列名中包含特殊字符?

使用 data.table 时如何从字符向量创建列名

R data.table:如何使用包含列名的 R 变量?

如何在data.table中使用某些列名的字符向量选择列?[重复]

Python中偶尔遇到的细节疑问:去除列名特殊字符标准差出现nan切片索引可超出范围range步长

带有包含特殊字符和空格的字符串的 MSAccess 更新语句