使用来自 readr 的 read_csv 在 header 中导入带空格的 CSV 文件

Import CSV file with spaces in header using read_csv from readr

我开始使用 readr 导入带有 read_csv 的 CSV 文件...如何处理 header 名称中包含空格的 CSV 文件?

read_csv 使用空格(和特殊字符)导入它们,这使我无法直接进入 mutate 和其他 dplyr 函数。

我该如何处理?

谢谢!

读入数据后可以使用make.names

df <- data.frame(x=NA)
colnames(df) <- c("This col name has spaces")
colnames(df) <- make.names(colnames(df), unique=TRUE)

它将return列名称以句点而不是空格作为分隔符。

colnames(df)
[1] "This.col.name.has.spaces"

根据帮助页面 make.names 需要一个字符向量并且 returns a:

A syntactically valid name consisting of letters, numbers and the dot or underline characters and starts with a letter or the dot not followed by a number

编辑:包括一个带有特殊字符的示例。

df <- data.frame(x=NA)
colnames(df) <- c("Higher than 80(°F)")
colnames(df) <- make.names(colnames(df), unique=TRUE)

colnames(df)
[1] "Higher.than.80..F."

如您所见,make.names 采用 'illegal' 个字符并将其替换为句点,以防止在直接调用对象名称时出现任何语法 errors/issues。

如果要删除重复的 .,请添加 -

colnames(df) <- gsub('(\.)\1+', '\1', colnames(df))
colnames(df)
[1] "Higher.than.80.F."

当我在 headers 中导入包含空格的 csv 时,我实际上可以像往常一样使用美元运算符访问它们。假设我有一个像这样的 data.frame (df):

   a a b b
 1   1   1
 2   1   2

其中 "a a" 是第一列的名称,"b b" 是第二列的名称,我可以用

得到第一列
df$`a a`

但是如果你想改变它们,你可以像这样重命名它们:

names(df) <- c("a_a", "b_b")

您分配的矢量只需要与 data.frame 的列具有相同的长度。一种稍微更优雅的方法是使用 stringr 包。如果您想用下划线替换所有空格,只需键入以下内容:

library(stringr)    
names(df) <- str_replace_all(names(df), " ", "_")