2012-04-10 4 views
2

Ich habe eine Spalte von Zahlen von 1: 1000. Ich möchte die Bezeichnung "s" an die Vorderseite jeder Nummer anhängen, so dass die Gesamtzahl der Zeichen in jeder Zelle gleich bleibt. Zum Beispiel würde "1" "s0001" werden, "15" würde "s0015" werden, "620" würde "s0620" werden, und "1000" würde "s1000" werden.Verschachtelt, wenn sonst Anweisungen an Labels an Werte anfügen

Ich habe versucht, dies mit verschachtelten if else Anweisungen zu erreichen, aber ich bekomme immer den Fehler, dass die Bedingung Länge> 1 hat und nur das erste Element verwendet wird. Hier

ist ein Beispiel Datensatz und der Code Ich verwende:

df=data.frame(code=seq(1:1000)) 
df$code= 
    if (df$code < 10) { df$code=paste("s000",df$code,sep="") } else 
    if (100 > df$code & df$code >= 10) { df$code=paste("s00",df$code,sep=="") } else 
     if (1000 > df$code & df$code >= 100) { df$code=paste("s0",df$code,sep="") } else 
     { df$code=paste("s",df$code,sep="") } 

Ich vermute, es ist ein einfacher Weg, dies zu tun, ohne if else zu verwenden. Irgendwelche Gedanken?

Danke!


Lösung

Dank Joran! Wenn x nicht-kontinuierliche ganze Zahlen:

d=data.frame(x=sample(1:1000,500)) 
d$nc=nchar(d$x) 
ddply(d,.(nc),transform,lab = paste("s",paste(rep("0",4-unique(nc)),collapse = ""),x,sep = "")) 

Antwort

5

wie Kampf sprintf?

> sprintf('s%04d', c(1,10,100,1000)) 
[1] "s0001" "s0010" "s0100" "s1000" 
+0

+1 Viel, viel besser. – joran

+0

@joran Ich weiß nur, weil ich fragen musste, wenn ich vor langer Zeit dasselbe machte! – Justin

+0

Woah, schön! Danke Justin! – jslefche

1

Ich bin 100% sicher, dass es ein besserer Weg, dies zu tun, und ich bin ein wenig verlegen zu ddply greifen, aber das funktioniert zumindest:

d <- data.frame(x = 1:1000,nc = nchar(1:1000)) 
ddply(d,.(nc),transform,lab = paste("s",paste(rep("0",4-unique(nc)),collapse = ""),x,sep = "")) 

Dort gehen wir, das ist viel besser, denke ich:

paste("s",sapply(4-nchar(1:1000),function(i) paste(rep("0",i),collapse = "")),1:1000,sep = "") 
+0

Süß. Ich habe einen Datenrahmen, wo x nicht kontinuierliche ganze Zahlen von 1: 1000 ist, also ddply zur Rettung! – jslefche

+0

@jslefche Wenn ich dich nicht falsch verstanden habe, denke ich, dass meine zweite Lösung auch funktionieren sollte. Sie möchten etwas wie 'max (nchar (x))' anstelle der hart codierten 4. (Und natürlich ersetzen Sie alle '1: 1000' mit Ihrem Vektor.) – joran