繁体   English   中英

使用 read.csv() 时保持前导 0

[英]Keeping leading 0s when at using read.csv()

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

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

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

我将分多个步骤执行此操作:

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

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"

定义一个特殊的 class,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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM