2016-03-07 7 views
1

У меня есть кадр данных, который включает столбец Reference. Это 10-значное число, которое может начинаться с нулей. При ввозе R, ведущие нули исчезают, которые я хотел бы добавить обратно.Добавление начального нуля после импорта в R

Я попытался с помощью sprintf и formatC, но у меня есть разные проблемы, связанные с каждым из них.

DF=data.frame(Reference=c(102030405,2567894562,235648759), Data=c(10,20,30)) 

Выходы я получаю следующее:

> sprintf('%010d', DF$Reference) 
[1] "0102030405" "  NA" "0235648759" 
Warning message: 
In sprintf("%010d", DF$Reference) : NAs introduced by coercion 
> formatC(DF$Reference, width=10, flag="0") 
[1] "001.02e+08" "02.568e+09" "02.356e+08" 

Первый выход дает NA, когда число уже имеет 10 цифр, а вторая сохраняет результат в стандартной форме.

Что мне нужно:

[1] 0102030405 2567894562 0235648759 
+2

Я думаю, что ваш ожидаемый результат не отражает с ведущими нулями .. – akrun

+0

работе с примерами в http://stackoverflow.com/questions/5812493/adding -leading-zeros-using-r, приводит к 'library (stringr); str_pad (DF $ Reference, 10, pad = "0") ' – user20650

+0

Я просто заметил это и отредактировал сообщение. Раньше я не встречался с «str_pad», но, похоже, это трюк. Спасибо. – sym246

ответ

4
library(stringi) 
DF = data.frame(Reference = c(102030405,2567894562,235648759), Data = c(10,20,30)) 
DF$Reference = stri_pad_left(DF$Reference, 10, "0") 
DF 
# Reference Data 
# 1 0102030405 10 
# 2 2567894562 20 
# 3 0235648759 30 

Альтернативные решения: Adding leading zeros using R.

При ввозе R, ведущие нули исчезают, которые я хотел бы добавить обратно.

Чтение столбца (ов) в качестве символов бы избежать этой проблемы сразу. Вы можете использовать readr::read_csv() с аргументом col_types.

+1

Реквизиты для реального решения: сначала прочитайте файл. –

+2

Хотя 'read.csv' с аргументом' colClasses' работает так же хорошо, как 'read_csv' с' col_types'. –

+0

Правильно, спасибо за указание на colClasses. (Http://stackoverflow.com/questions/2805357/specifying-colclasses-in-the-read-csv) – effel

1

formatC

Вы можете использовать

formatC(DF$Reference, digits = 0, width = 10, format ="f", flag="0") 
# [1] "0102030405" "2567894562" "0235648759" 

Sprintf

Использование d в sprintf означает, что ваши значения являются целыми числами (или они должны быть преобразованы с as.integer()). help(integer) объясняет, что:

«диапазон представимых чисел ограничена до +/- 2 * 10^9: двойники может содержать гораздо больше целых чисел точно.»

Именно поэтому as.integer(2567894562) возвращает NA.

Другая работа вокруг будет использовать формат символов s в sprintf:

sprintf('%010s',DF$Reference) 
# [1] " 102030405" "2567894562" " 235648759" 

Но это дает пробелы вместо ведущих нулей. gsub() может добавить нули назад, заменяя пробелы нулями:

gsub(" ","0",sprintf('%010s',DF$Reference)) 
# [1] "0102030405" "2567894562" "0235648759" 

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

  • Нет связанных вопросов^_^