【问题标题】:Keeping leading 0s when at using read.csv()使用 read.csv() 时保持前导 0
【发布时间】:2022-01-19 15:38:56
【问题描述】:

我正在尝试创建一个从文件夹中读取多个 CSV 并将它们转换为 xlsx 的工具。我的问题是,在某些变量中,我想保留前导零。但是变量名称因文件而异,而且每次我都需要这个工具时。

那么,有没有办法在使用read.csv() 读取文件时自动检测任何变量中的前导 0?

阅读后我无法应用格式,因为我不会完全知道需要应用它的变量名称。我不能强制每一列都变成文本,因为我还有其他变量需要是数字。

【问题讨论】:

    标签: r csv format xlsx


    【解决方案1】:

    定义一个特殊的类 num2,然后用它运行 read.csv。

    setClass("num2")
    
    setAs("character", "num2",
      function(from) {
        from2 <- type.convert(from, as.is = TRUE)
        if (is.numeric(from2) && any(grepl("^0", from))) from else from2
      })
    
    DF <- read.csv(text = Lines, colClasses = "num2")
    str(DF)
    ## 'data.frame':   2 obs. of  4 variables:
    ##  $ a: int  1 2
    ##  $ b: int  2 4
    ##  $ c: chr  "03" "05"
    ##  $ d: chr  "ab" "cd"
    

    注意

    样本数据

    Lines <- "a,b,c,d
    1,2,03,ab
    2,4,05,cd"
    

    【讨论】:

    • 真正的好方法。
    【解决方案2】:

    我会分多个步骤进行:

    首先,我会在表格中阅读所有内容:

    df <- read.table(file, sep=',', colClasses='character')
    df
    
      a  b   c
    1 1 01   3
    2 2 10 043
    3 3 30  43
    4 4 40 043
    

    然后,我会遍历表格以检查前导零

    leading_zeros = sapply(df, function(x) any(startsWith(x, '0')))
    leading_zeros
        a     b     c 
    FALSE  TRUE  TRUE 
    

    然后,您可以将不带前导零的列转换为数字:

    str(df)
    'data.frame':   4 obs. of  3 variables:
     $ a: chr  "1" "2" "3" "4"
     $ b: chr  "01" "10" "30" "40"
     $ c: chr  "3" "043" "43" "043"
    
    df[!leading_zeros] <- sapply(df[!leading_zeros], as.numeric)
    
    str(df)
    'data.frame':   4 obs. of  3 variables:
     $ a: num [1:4, 1] 1 2 3 4
      ..- attr(*, "dimnames")=List of 2
      .. ..$ : NULL
      .. ..$ : chr "a"
     $ b: chr  "01" "10" "30" "40"
     $ c: chr  "3" "043" "43" "043"
    

    【讨论】:

    • 我们知道所有其他列都是数字吗?如果不是,此方法将生成 NA,将字符向量强制转换为数字...
    • @SamR 从他们对问题的有限描述来看,情况似乎如此。但是,如果他们有更复杂的要求,他们没有提及。
    • 从描述中,“我还有其他需要为数字的变量”意味着我有字符列。
    • @caldwellst 然后他们可以使用他们需要的任何逻辑来选择这些列。我在问题中只能看到:1)前导 0 的列必须是字符,2)其他列(一些?全部?)应该是数字。如果有另一个因素决定字符列,他们没有提到它,所以我不能将它合并到答案中。如果有,他们可以将该逻辑添加到leading_zeroes 函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-02-12
    • 2023-01-26
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多