【问题标题】:Import CSV file with spaces in header using read_csv from readr使用来自 readr 的 read_csv 导入带有空格的 CSV 文件
【发布时间】:2017-09-22 15:27:32
【问题描述】:

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

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

我该如何处理?

谢谢!

【问题讨论】:

    标签: r readr


    【解决方案1】:

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

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

    它将返回带有句点而不是空格作为分隔符的列名。

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

    根据帮助页面make.names接受一个字符向量并返回一个:

    由字母、数字和点或点组成的语法上有效的名称 下划线字符并以字母或不跟随的点开头 一个数字

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

    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 采用“非法”字符并将其替换为句点,以防止直接调用对象名称时出现任何语法错误/问题。

    如果你想删除重复的.'s 然后添加-

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

    【讨论】:

    • 你知道这种方法是否适用于特殊字符吗?例如,当导入天气数据read_csv 导入度数符号时可能会导致错误(我还没尝试过,一旦有就会更新!)...
    • 这回答了我原来的问题并教会了我一个新功能,谢谢!顺便说一句,当导入带有 read_csv 且标题包含度数符号的 CSV 文件时,我得到“Temperature..U.00B0.F”,而 read.csv 返回“Temperature..F”
    • 看起来像是 degree 的 unicode 字符。
    【解决方案2】:

    当我导入包含标题中空格的 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), " ", "_")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2015-02-08
      • 2021-10-24
      • 2015-10-12
      相关资源
      最近更新 更多