X.在我的R数据框的列名中

几个月前 ,我问了一个关于这个问题的问题 ,我想答案已经解决了我的问题,但是我又一次遇到了问题,解决scheme对我没有任何作用。

我正在导入CSV:

orders <- read.csv("<file_location>", sep=",", header=T, check.names = FALSE) 

这里是数据框的结构:

 str(orders) 'data.frame': 3331575 obs. of 2 variables: $ OrderID : num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... $ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... 

如果我在第一列OrderID上运行length命令,我得到这个:

 length(orders$OrderID) [1] 0 

如果我运行OrderDate的length ,它会正确返回:

 length(orders$OrderDate) [1] 3331575 

这是CSV head的复制/粘贴。

 OrderID,OrderDate -2034590217,2011-10-14 -2034590216,2011-10-14 -2031892773,2011-10-24 -2031892767,2011-10-21 -2021008573,2011-12-08 -2021008572,2011-12-07 -2021008571,2011-12-07 -2021008570,2011-12-07 -2021008569,2011-12-07 

现在,如果我重新运行read.csv ,但是取出check.names选项,则dataframe check.names的第一列现在在名称的开始处具有X.

 orders2 <- read.csv("<file_location>", sep=",", header=T) str(orders2) 'data.frame': 3331575 obs. of 2 variables: $ X.OrderID: num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... $ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... length(orders$X.OrderID) [1] 3331575 

这工作正常。

我的问题是为什么R添加一个X到第一列名的开头? 正如您从CSV文件中看到的,没有特殊字符。 这应该是一个简单的负载。 添加check.names ,而从CSV中导入名称,将导致数据不能正确加载,我执行分析。

我能做些什么来解决这个问题?

附注:我意识到这是一个未成年人 – 我只是更加沮丧的事实,我认为我正在加载,但没有得到我预期的结果。 我可以使用colnames(orders)[1] <- "OrderID"重命名列,但仍然想知道为什么它不能正确加载。

read.csv()是更一般的read.table()函数的一个包装。 后一个函数的参数check.names被logging为:

 check.names: logical. If 'TRUE' then the names of the variables in the data frame 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. 

如果标题包含的标签不是语法上有效的,那么make.names()会用一个有效的名字replace它们,根据无效的名字,删除无效的字符,并且可能会预先考虑X

 R> make.names("$Foo") [1] "X.Foo" 

这在?make.names

 Details: A syntactically valid name consists of letters, numbers and the dot or underline characters and starts with a letter or the dot not followed by a number. Names such as '".2way"' are not valid, and neither are the reserved words. The definition of a _letter_ depends on the current locale, but only ASCII digits are considered to be digits. The character '"X"' is prepended if necessary. All invalid characters are translated to '"."'. A missing value is translated to '"NA"'. Names which match R keywords have a dot appended to them. Duplicated values are altered by 'make.unique'. 

您所看到的行为与您的数据中加载的read.table()方法完全一致。 这意味着您的CSV文件的标题行中有语法无效的标签。 请注意,从?make.names ,什么是字母取决于系统的语言环境; CSV文件可能包含文本编辑器将显示的有效字符,但是如果R没有以相同的语言环境运行,那么字符在那里可能不是有效的,例如?

我会查看CSV文件并确定标题行中的任何非ASCII字符; 在标题行中也可能有不可见字符(或转义序列; \t ?)。 在文件中读取非有效的名字和在控制台上显示它可能会掩盖无效的字符之间可能会发生很多事情,所以不要在没有check.names情况下显示任何错误check.names表示文件正常。

发布sessionInfo()的输出也是有用的。

我刚刚遇到这个问题,这是一个简单的原因。 我有一个以数字开头的标签,R在他们前面加了一个X. 我认为R与标题中的一个数字混淆,并应用一个字母来区分值。

所以,“3_in”变成了“X3_in”等…我通过将标签切换到“in_3”来解决问题。

我希望这可以帮助别人。

我跑了一个类似的问题,并希望分享以下代码行来更正列名称。 当然不是完美的,因为正手的清理编程会更好,但也许有助于作为快速和肮脏的方法的起点。 (我本来希望把它们joinRyan的问题/ Gavin的回答中,但是我的名声还不够高,所以我不得不发表一个额外的答案 – 对不起)。

在我的情况下,写入和读取数据的几个步骤产生了一个或多个名为“X”,X.1“,…的列,其中包含X列中的内容和X.1,…-列中的行号。在我的情况下,X列的内容应该用作行名称,其他X.1,…-列应该被删除。

 Correct_Colnames <- function(df) { delete.columns <- grep("(^X$)|(^X\\.)(\\d+)($)", colnames(df), perl=T) if (length(delete.columns) > 0) { row.names(df) <- as.character(df[, grep("^X$", colnames(df))]) #other data types might apply than character or #introduction of a new separate column might be suitable df <- df[,-delete.columns] colnames(df) <- gsub("^X", "", colnames(df)) #X might be replaced by different characters, instead of being deleted } return(df) } 

我通过在write.csv函数中包含row.names = FALSE作为参数解决了类似的问题。 write.csv在CSV文件中包含行名称作为未命名的列,read.csv在读取CSV文件时命名该列为'X'。