477 Stimmen

Wie fügt man führende Nullen hinzu?

Ich habe einen Datensatz, der in etwa wie folgt aussieht:

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

Ich möchte, dass vor jeder Tier-ID eine Null hinzugefügt wird:

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

Und was ist, wenn ich interessehalber zwei oder drei Nullen vor den Tier-IDs hinzufügen muss?

9 Stimmen

Angenommen, Sie möchten n Nullen vor den Tier-IDs hinzufügen, dann müssen Sie nur Folgendes tun data$anim = paste(rep(0, n), data$anim, sep = "")

3 Stimmen

Wenn Sie sagen, dass Sie "Nullen hinzufügen" möchten, möchten Sie vermutlich nicht Ihre Integer-Spalten in String/Kategorisch konvertieren, um die Nullen in den Daten selbst hinzuzufügen, sondern Sie möchten sie ganzzahlig lassen und beim Rendern der Ausgabe nur führende Nullen ausgeben .

1voto

Ursus Frost Punkte 285

Hier ist eine weitere Alternative für das Hinzufügen von führenden bis 0s zu Zeichenketten wie CUSIPs die manchmal wie eine Zahl aussehen können und die von vielen Anwendungen, wie z. B. Excel, verfälscht werden, indem die führenden 0s entfernt oder in wissenschaftliche Notation umgewandelt werden.

Als ich die von @metasequoia gegebene Antwort ausprobierte, hatte der zurückgegebene Vektor führende Leerzeichen und nicht 0 s. Dies war das gleiche Problem, das @user1816679 erwähnte -- und das Entfernen der Anführungszeichen um das 0 oder den Wechsel von %d à %s hat auch keinen Unterschied gemacht. Zu Ihrer Information: Ich verwende RStudio Server, das auf einem Ubuntu Server läuft. Diese kleine zweistufige Lösung hat bei mir funktioniert:

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

unter Verwendung der %>% pipe-Funktion aus der magrittr Paket könnte es so aussehen:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

Ich würde eine Ein-Funktions-Lösung vorziehen, aber es funktioniert.

1voto

Phil Punkte 9

Für andere Fälle, in denen die Zahlenfolge konsistent sein soll, habe ich eine Funktion entwickelt.

Vielleicht findet jemand dies nützlich:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

Entschuldigung für die Formatierung.

0voto

zhan2383 Punkte 629
data$anim <- sapply(0, paste0,data$anim)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X