2016-04-06 10 views
0

ich folgende data.table als Beispiel erstellt zu erstellen:Erster rep (0, x) in Kombination mit data.table in R, um führende Nullen (ungültige Zeiten Argument)

dt <- data.table(x = c(1, 12, 200, 1600)) 
dt[, y := " "] 

Mein Ziel ist es, Füllen Sie die Spalte y mit den um führende Nullen erweiterten x-Werten so, dass jeder Eintrag in y aus vier Ziffern besteht (dh 0001, 0012, 0200, 1600).

Meine Idee ist wie folgt:

dt[, y := x] # fill column with original values 
dt[nchar(as.integer(x)) < 4, y := paste(paste(rep(0, 4-nchar(as.integer(x))), collapse=""), x, sep="")] 

Dieser Befehl sollte geprüft werden, ob x von weniger als 4 Ziffern bestehen, und wenn ja, um die erforderliche Anzahl von Nullen erzeugen und sie an der Paste Anfang der Zeichenfolge. Die Ausführung der Anweisung ergibt jedoch die Nachricht "Fehler in rep (0, 4 - nchar (as.integer (x))): ungültig 'mal' Argument".

Ich weiß, dass meine Grundidee richtig ist, da der folgende Befehl funktioniert:

dt[nchar(as.integer(x)) < 4, y := paste(paste(rep(0, 4), collapse=""), x, sep="")] 

Hier habe ich ersetzt einfach das zweite Argument in rep() durch eine Zufallszahl (4 in diesem Fall).

Daher hat rep() offensichtlich einige Probleme, die Spaltenreferenz von x zu verstehen. Andere Funktionen (z. B. as.numeric() und viele mehr) haben keine Probleme damit.

Danke für jede Hilfe!

+0

Blick in sprintf. – Heroka

Antwort

0

Ich denke, das Problem ist, dass Sie rep() einen Vektor der Länge> 1 füttern.

Es gibt wahrscheinlich Formate, die Sie verwenden können? Im Folgenden finden Sie eine Problemumgehung Schritt für Schritt.

dt <- data.frame(x = c(1, 12, 200, 1600)) 

dt$times_to_rep<-4-nchar(dt$x) 
dt$power_of_ten<-10^dt$times_to_rep 
dt$zeros<-substring(dt$power_of_ten,2,nchar(dt$power_of_ten)) 
dt$y<-paste0(dt$zeros, dt$x, sep = '') 
1

Juse formatC verwenden:

library(data.table) 
dt <- data.table(x = c(1, 12, 200, 1600)) 
dt[, y := formatC(x, width = 6, format = "d", flag = "0")] # 
dt 

     x  y 
1: 1 000001 
2: 12 000012 
3: 200 000200 
4: 1600 001600 
Verwandte Themen