Mam zestaw danych, który wygląda mniej więcej tak:
anim <- c(25499,25500,25501,25502,25503,25504)
sex <- c(1,2,2,1,2,1)
wt <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)
data
anim sex wt anim2
1 25499 1 0.8 2
2 25500 2 1.2 2
3 25501 2 1.0 2
4 25502 1 2.0 2
5 25503 2 1.8 2
6 25504 1 1.4 2
Chciałbym dodać zero przed każdym identyfikatorem zwierzęcia:
data
anim sex wt anim2
1 025499 1 0.8 2
2 025500 2 1.2 2
3 025501 2 1.0 2
4 025502 1 2.0 2
5 025503 2 1.8 2
6 025504 1 1.4 2
A na wszelki wypadek, co jeśli muszę dodać dwa lub trzy zera przed identyfikatorem zwierzęcia?
data$anim = paste(rep(0, n), data$anim, sep = "")
Odpowiedzi:
Wersja skrócona: użyj
formatC
lubsprintf
.Dłuższa wersja:
Dostępnych jest kilka funkcji formatowania liczb, w tym dodawanie zer wiodących. Wybór najlepszego zależy od tego, jakie inne formatowanie chcesz wykonać.
Przykład z pytania jest dość łatwy, ponieważ wszystkie wartości mają na początku tę samą liczbę cyfr, więc spróbujmy trudniejszego przykładu tworzenia potęg 10 o szerokości 8.
paste
(i jest to wariantpaste0
) są często pierwszymi napotkanymi funkcjami manipulacji ciągami. Nie są tak naprawdę zaprojektowane do manipulowania liczbami, ale można do tego użyć. W prostym przypadku, w którym zawsze musimy wstawić jedno zero,paste0
jest najlepszym rozwiązaniem.W przypadku, gdy w liczbach jest zmienna liczba cyfr, musisz ręcznie obliczyć liczbę zer do uzupełnienia, co jest na tyle okropne, że powinieneś to zrobić tylko z chorobliwej ciekawości.
str_pad
odstringr
działa podobnie dopaste
, czyniąc bardziej wyraźnym, że chcesz uzupełniać.Ponownie, nie jest tak naprawdę przeznaczony do używania z liczbami, więc trudniejszy przypadek wymaga trochę myślenia. Powinniśmy być w stanie powiedzieć „pad z zerami do szerokości 8”, ale spójrzmy na ten wynik:
Musisz ustawić opcję kary naukowej , aby liczby były zawsze formatowane przy użyciu stałej notacji (a nie notacji naukowej).
stri_pad
wstringi
dziełach dokładnie takich jakstr_pad
zstringr
.formatC
jest interfejsem funkcji Cprintf
. Korzystanie z niej wymaga pewnej wiedzy na temat arkanów tej podstawowej funkcji (patrz link). W tym przypadku ważne punkty sąwidth
argumentem,format
będąc"d"
na „całkowitą”, a"0"
flag
na poprzedzenie zerami.To moje ulubione rozwiązanie, ponieważ łatwo jest majstrować przy zmianie szerokości, a funkcja jest wystarczająco potężna, aby dokonywać innych zmian formatowania.
sprintf
jest interfejsem do funkcji C o tej samej nazwie; jak,formatC
ale z inną składnią.Główną zaletą
sprintf
jest to, że można osadzić sformatowane liczby w dłuższych fragmentach tekstu.Zobacz także odpowiedź goodside .
Dla kompletności warto wspomnieć o innych funkcjach formatowania, które okazjonalnie są przydatne, ale nie mają metody dodawania zer.
format
, ogólna funkcja do formatowania dowolnego rodzaju obiektu, z metodą liczbową. Działa trochę podobnieformatC
, ale z jeszcze innym interfejsem.prettyNum
to kolejna funkcja formatowania, głównie do tworzenia ręcznych etykiet zaznaczenia osi. Działa szczególnie dobrze w szerokim zakresie liczb.scales
Pakiet ma kilka funkcji, takich jakpercent
,date_format
idollar
dla typów formatów specjalistycznych.źródło
flag = "0"
.?sprintf
Opisuje to sekcja Szczegóły na stronie pomocy. „mn: Dwie liczby oddzielone kropką, oznaczające szerokość pola (m) i dokładność (n).”Aby uzyskać ogólne rozwiązanie, które działa niezależnie od liczby cyfr
data$anim
, użyjsprintf
funkcji. Działa to tak:W twoim przypadku prawdopodobnie chcesz:
data$anim <- sprintf("%06d", data$anim)
źródło
sprintf
konwertuje liczbę na ciąg (znak).Rozwijanie odpowiedzi @ goodside's:
W niektórych przypadkach możesz chcieć uzupełnić ciąg zerami (np. Kody fips lub inne czynniki numeryczne). W OSX / Linux:
Ale ponieważ
sprintf()
wywołujesprintf()
komendę C systemu operacyjnego , omówioną tutaj , w Windows 7 otrzymujesz inny wynik:Na komputerach z systemem Windows obejście:
źródło
str_pad
jest teraz moją drogą do.str_pad
zstringr
paczki jest alternatywą.źródło
str_pad
ponieważ może to prowadzić do nieoczekiwanych rezultatów.i.num = 600000
;str_pad(i.num, width = 7, pad = "0")
da ci „006e + 05”, a nie „0600000”Oto uogólniająca podstawowa funkcja R:
Podoba mi się,
sprintf
ale zawiera pewne zastrzeżenia:źródło
Oto kolejna alternatywa dla dodawania wiodących zer do ciągów takich jak CUSIP, które czasami mogą wyglądać jak liczby i które wiele aplikacji, takich jak Excel, uszkodzi i usunie wiodące zera lub przekształci je w notację naukową.
Kiedy próbowałem odpowiedzi dostarczonej przez @metasequoia, zwrócony wektor miał wiodące spacje, a nie
0
s. Był to ten sam problem, o którym wspominał @ user1816679 - i usunięcie cudzysłowów wokół0
lub zmiana z%d
na%s
również nie miało znaczenia. Do Twojej wiadomości używam RStudio Server działającego na serwerze Ubuntu. To małe dwustopniowe rozwiązanie działało dla mnie:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
przy użyciu
%>%
funkcji potoku zmagrittr
pakietu może wyglądać następująco:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Wolałbym rozwiązanie jednofunkcyjne, ale działa.
źródło
źródło
paste0(0, data$anim)
działałoby dobrze.Dla innych okoliczności, w których chcesz, aby ciąg liczb był spójny, utworzyłem funkcję.
Ktoś może uznać to za przydatne:
Przepraszamy za formatowanie.
źródło