避免在使用read.csv()时将列名中的空格替换为句点(";)
我使用R做一些数据预处理,我面临的问题是:我使用避免在使用read.csv()时将列名中的空格替换为句点(";),r,names,read.csv,R,Names,Read.csv,我使用R做一些数据预处理,我面临的问题是:我使用read.csv(filename,header=TRUE)输入数据,然后变量名中的空格变为“.”,例如,在生成的数据框中,名为Full code的变量变为Full.code。处理后,我使用write.xlsx(文件名)导出结果,同时更改变量名。如何解决这个问题 此外,在output.xlsx文件中,第一列变为索引(即1到N),这不是我所期望的。要在名称中返回空格,请执行此操作(在导出之前,-R确实允许在变量名称中使用空格,但这很麻烦): #用空格
read.csv(filename,header=TRUE)
输入数据,然后变量名中的空格变为“.”,例如,在生成的数据框中,名为Full code的变量变为Full.code。处理后,我使用write.xlsx(文件名)
导出结果,同时更改变量名。如何解决这个问题
此外,在output.xlsx文件中,第一列变为索引(即1到N),这不是我所期望的。要在名称中返回空格,请执行此操作(在导出之前,-R确实允许在变量名称中使用空格,但这很麻烦):
#用空格替换点的简单正则表达式
#这可能会产生意想不到的后果,所以一定要检查结果
名称(您的数据)如果您在读取数据时在read.csv
中设置了check.names=FALSE
,则不会更改名称,并且在将数据写回之前不需要编辑名称。当然,这意味着您需要在编辑时引用列名(在某些情况下使用反引号),或者按位置而不是名称引用列。这里有一个函数(对不起,我知道它可以重构),它可以生成漂亮的列名,即使有多个连续点和尾随点:
makeColNamesUserFriendly <- function(ds) {
# FIXME: Repetitive.
# Convert any number of consecutive dots to a single space.
names(ds) <- gsub(x = names(ds),
pattern = "(\\.)+",
replacement = " ")
# Drop the trailing spaces.
names(ds) <- gsub(x = names(ds),
pattern = "( )+$",
replacement = "")
ds
}
makeColNamesUserFriendly为了补充已经提供的答案,这里有另一种方法,通过使用正则表达式和stringr包替换列名中的“.”或任何其他类型的点状标记,如下所示:
require(“stringr”)
colnames(data) <- str_replace_all(colnames(data), "[:punct:]", " ")
我会给你
[1] "variable x" "variable y" "variable z"
您可以通过调用read.csv
选项check.names=FALSE
来避免修复名称。非常感谢!gsub()
函数工作正常。但我仍然有一个问题:为什么我们应该使用两个转义,而不是简单地使用pattern=“\.”“
?@zenotsang好问题-我不知道为什么R需要这样做。当R解析器解析字符串时,第一个转义就用光了,这会为正则表达式留下一个“\”。如果您绕过常规解析器,那么只需一个反斜杠就可以解决问题(但这可能比它值得做的工作要多)。显然,遵循R中的规则更好:)非常感谢!我认为使用check.names=FALSE
比编辑列名更好,尽管重读数据对我来说需要做很多工作。总之,谢谢你的回答!这对我帮助很大。
require(“stringr”)
colnames(data) <- str_replace_all(colnames(data), "[:punct:]", " ")
data <- data.frame(variable.x = 1:10, variable.y = 21:30, variable.z = "const")
colnames(data) <- str_replace_all(colnames(data), "[:punct:]", " ")
colnames(data)
[1] "variable x" "variable y" "variable z"