2015-09-04 4 views
1

Я хотел бы преобразовать десятичные координаты (например, -62,54879632547) до фиксированных строк ширины следующего образом:Преобразования десятичного числа с отрицательным знаком с фиксированной шириной строки

отрицательного числа -> ведущий 0

положительного числа -> ведущий 1

затем 3 цифры для целой части

62 -> 062

2 -> 002

Затем 6 цифр после запятой (и удаления десятичной)

.54879632547 -> 548796

Заключительных restuls:

-62,54879632547 -> 0062548796 (т.е. 0 062 548796)

Как сделать это быстро и эффективно в R?

Я сделал следующую функцию, но она довольно медленно (при использовании с lapply над миллионами значений):

 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  
     } 
    } 

любой помощь ценится

лучшего

ответ

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" 
+0

Большое спасибо Heroka! Ваш код на 2 раза быстрее. Как вы думаете, я могу использовать mclappy? Я попробовал следующее, и это не сработало: x1 <- runif (1000000, 5.0, 7.5). T <- mclapply (x1, formatter, m.cores = 4) Предупреждающее сообщение: все запланированные ядра обнаружили ошибки в код пользователя – user22364

+0

Я не знаком с mclappy. Тем не менее, форматирование (x1) выполнялось через 7 секунд на моей машине. Не уверен, что это слишком медленно для вас (я часто трачу больше времени на оптимизацию кода, чем на выигранное время) – Heroka

+0

Еще раз спасибо, я использовал apply (x1), потому что мой код основан на одном значении, но с использованием formatter (x1) без lapply на 13 раз быстрее, чем мой код, что отлично! – user22364

Смежные вопросы