我想将小数点坐标(例如-62.54879632547)转换为固定宽度的字符串,如下所示:
负数 - >领先0
正数 - >领先1
然后是整数部分的3位数
62 - > 062
2 - > 002
然后是小数点后的6位数(并删除小数)
.54879632547 - > 548796
最后的恢复:
-62.54879632547 - > 0062548796(即0 062 548796)
如何在R中快速有效地完成这项工作?
我已经完成了以下功能,但它很慢(当与数百万的值一起使用时):
formatCoordinate <- function (x) {
if (!is.na(x)) {
sign <- ifelse(x < 0, 0, 1)
castIntergerPart <- function (x) {
#integer part should be exactly 3 digits with leading zeros if necessary
if (abs(x) < 10) {
intgerPart <- paste0("00", abs(as.integer(x)))
}else if (abs(x) >=10 & abs(x) < 100) {
intgerPart <- paste0("0", abs(as.integer(x)))
}else if (abs(x) >= 100) {
intgerPart <- paste0(abs(as.integer(x)))
}
}
castDecimalPart <- function(x) {
s <- toString(x)
sub(".*?.(.*?);.*", "\\1", s)
substr(unlist(strsplit(s, split='.', fixed=TRUE))[2], 1, 6)
}
formattedCoordinate = paste0(sign, castIntergerPart(x), castDecimalPart(x))
}else{
NA
}
}
感谢任何帮助
最好的
答案 0 :(得分:2)
使用一些字符串格式和正则表达式。可以处理数字向量。
formatter <- function(x){
first_part <- ifelse(x < 0 , "0","1")
second_part <- abs(as.integer(x))
third_part <- substr(gsub(".+\\.","",as.character(x)),1,6)
result <- ifelse(!is.na(x),sprintf("%s%03d%s",first_part,second_part,third_part), NA)
result
}
> formatter(-62.54879632547)
[1] "0062548796"