2017-04-21 10 views
2

Ich versuche, die Anzahl der Nachkommastellen auf 1 gesetzt ich diese Berechnung durchgeführt habe:nicht in der Lage Anzahl der Ziffern einstellen, nach dezimal mit Paste-Funktion (R)

options(digits = 3) 
DT<-data.table(x=c("a","b","c",NA,"b","e"),v=rnorm(6)) 
ans<-DT[,lapply(.SD,function(x) length(which(is.na(x)))/length(x)*100)] 

nun am gibt mir den Anteil der nationalen Agenturen in einer Spalte:

x v 
    16.7 0 

Aber wenn ich versuche, das Prozentzeichen "%" hinzufügen mit:

ans[,lapply(.SD, function(x) paste(x,"%",sep = ''))] 

Die Dezimalziffern sind wieder da:

    x v 
1: 16.6666666666667% 0% 

Was mache ich falsch? Wie kann ich diese Ausgabe erhalten ?:

x v 
16.7% 0% 

Vielen Dank.

+0

auch 'round', wie' ans <-DT [, lapply (.SD, Funktion (x) Runde (Länge (was (ist.na (x)))/Länge (x) * 100, 1))] 'dann dein letzter Schritt. Beachten Sie, dass 'options (digits = 3)' die Anzahl der gedruckten Ziffern und nicht die Anzahl der Stellen, die R für jede Nummer speichert, steuert. – lmo

+0

Nützliche Erklärung, danke. –

Antwort

1

Wir verwenden nur sprintf, indem sie es auf zwei Dezimalstellen konvertieren und verketten mit %

DT[, lapply(.SD, function(x) sprintf("%0.1f%%", 100*sum(is.na(x))/.N))] 

Oder wir können nur format

DT[, lapply(.SD, function(x) paste0(format(100*sum(is.na(x))/.N, digits = 3), "%"))] 
#  x v 
#1: 16.7% 0% 
1

Sie nur round verwenden können und tun :

paste0(round(ans,1),"%") 

, die

[1] "16.7%" "0%" 

oder Ändern OPs Code gibt:

ans[,lapply(.SD, function(x) paste(round(x,1),"%",sep = ''))]