使用 read.csv() 时保持前导 0
Keeping leading 0s when at using read.csv()
我正在尝试创建一个从文件夹中读取多个 CSV 并将它们转换为 xlsx 的工具。我的问题是在某些变量中有我想保留的前导零。但是变量名称因文件而异,而且每次我都需要这个工具。
那么,在使用 read.csv()
读取文件时,有没有办法自动检测任何变量中的前导 0?
我无法在阅读后应用格式,因为我不会完全知道我需要应用它的变量名。我不能强制每一列都变成文本,因为我还有其他变量需要是数字。
我会分多个步骤执行此操作:
首先,我在 table 中阅读了所有内容:
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
然后,我将遍历 table 以检查前导零
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"
我正在尝试创建一个从文件夹中读取多个 CSV 并将它们转换为 xlsx 的工具。我的问题是在某些变量中有我想保留的前导零。但是变量名称因文件而异,而且每次我都需要这个工具。
那么,在使用 read.csv()
读取文件时,有没有办法自动检测任何变量中的前导 0?
我无法在阅读后应用格式,因为我不会完全知道我需要应用它的变量名。我不能强制每一列都变成文本,因为我还有其他变量需要是数字。
我会分多个步骤执行此操作:
首先,我在 table 中阅读了所有内容:
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
然后,我将遍历 table 以检查前导零
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"