2009-09-29 12 views
7

Ich versuche, eine Ausgabe von einer einfachen by() Funktion in R zu runden. Das ist, was ich habe:Rundung Ausgang von durch Funktion in R

> by(glaciers[,1:3],glaciers$activity.level,mean) 

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
-9.444444e+00 1.771778e+03 3.247643e+09 
------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
1.041667e+01 2.067583e+03 4.048301e+09 
------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
1.766667e+01 2.168000e+03 2.759283e+09 

Wie kann ich meine Ausgabe zu sagen, 5 Dezimalstellen zu runden, und nach wie vor die Faktoren halten?

Ich habe versucht: round(by(glaciers[,1:3],glaciers$activity.level,mean),5), aber einen Fehler erhalten: Non-numeric argument to mathematical function.

+2

einfach hinzuzufügen: die Ausgabe der durch() Funktion eines „von“ Objekt ist, so dass Sie nicht Dinge wie Runde machen können() zu ihm. – Shane

Antwort

4
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 

UPDATE

Hier ist ein funktionierendes Beispiel:

glaciers <- as.data.frame(matrix(rnorm(1000),ncol=4)) 
glaciers[,4] <- sample(0:3,250,replace=TRUE) 
colnames(glaciers) <- c("A","B","C","activity.level") 
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 
+0

Rob, Ich habe auch diese Methode versucht, bekomme aber immer noch ungerundete Zahlen mit Exponenten wie oben. Nicht sicher, warum die Funktion round() durchlaufen wird. –

+0

Ich spielte mit diesem mehr herum und fand, dass, wenn ich um .5 sage, dann wird es tatsächlich Runde aber zu nur 1 Dezimalstelle. Ich möchte runden, um 3-5 Dezimalstellen zu sagen, aber die ganze Zahl scheint das nicht zu tun. –

+0

Ich weiß nicht, was Sie tun. Ich habe meine Antwort aktualisiert, um ein funktionierendes Beispiel hinzuzufügen. –

10

Wenn Sie bereits die Ausgabe in eine Variable gespeichert haben, sagen x:

x <- by(glaciers[,1:3],glaciers$activity.level,mean) 

Dann bewerben round() zu jedem Element (die Ausgabe von by() ist in diesem Fall eine Liste).

Zuweisung zu x [] statt x ermöglicht es x, Attribute zu behalten, die von() an es angehängt sind.

Edit: round() ändert tatsächlich den Wert der Variablen, aber ist von seinem Drucken entkoppelt. Wenn Sie die wissenschaftliche Notation Ausgabeformat zu unterdrücken möchten, verwenden Sie format = "f" Argument FormatC()

> round(1.2345e10,5) 
[1] 1.2345e+10 
> formatC(1.2345e10,digits=5,format="f") 
[1] "12345000000.00000" 

So ist die Korrektur der Ausdruck ursprünglich würde

geschrieben sein
x[] <- lapply(x,formatC,digits=5,format="f") 
+0

Stephen, Ich habe diese Methode versucht, aber ich bekomme immer noch nicht Abgerundete Zahlen mit Exponentenausgaben wie oben. Irgendwelche Ideen? –

1

Möchten Sie Runde oder um nur die Anzahl der angezeigten Ziffern abzuschneiden? Wenn letzteres, benutze Optionen (Ziffern = 3) oder was auch immer.

> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
    cty hwy 
21.012 28.802 
------------------------------------------------------------ 
mpg$cyl: 5 
    cty hwy 
20.50 28.75 
------------------------------------------------------------ 
mpg$cyl: 6 
    cty hwy 
16.215 22.823 
------------------------------------------------------------ 
mpg$cyl: 8 
    cty hwy 
12.571 17.629 
> options(digits=3) 
> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
cty hwy 
21.0 28.8 
------------------------------------------------------------ 
mpg$cyl: 5 
cty hwy 
20.5 28.8 
------------------------------------------------------------ 
mpg$cyl: 6 
cty hwy 
16.2 22.8 
------------------------------------------------------------ 
mpg$cyl: 8 
cty hwy 
12.6 17.6 
1

haben nur ein paar Minuten, aber Sie könnten an den format(), formatC() und prettyNum() Funktionen versuchen suchen. Ihre Hilfe-Dateien sehen jetzt wie Kauderwelsch aus, aber ich habe nicht viel geschlafen. Allerdings habe ich eine dieser Funktionen - wahrscheinlich formatC() - für einen Sweave-Bericht vor einigen Monaten verwendet, in dem ich sehr spezifisch formatierte Zahlen brauchte.

+0

Zur Klarstellung: Sie müssten es in die Funktion by() einfügen, wie es Rob und Stephen mit round() getan haben. –

6

round() macht in diesem Fall keinen Sinn, da Sie mit sehr großen Zahlen arbeiten. Sie möchten den Befehl format() verwenden und auswählen, wie viele Ziffern angezeigt werden sollen. Zum Beispiel drei signifikante Stellen zu zeigen:

by(glaciers[,1:3], glaciers$activity.level, function(x) { 
     as.numeric(format(mean(x), digits=3)) 
}) 
2

Sie fragte: „Wie kann ich meine Ausgabe abzurunden bekommen 5 Dezimalstellen zu sagen?“ Aber ich denke, was Sie meinten, war: "Wie kann ich meine Ausgabe dazu bringen, 6 signifikante Zahlen zu zeigen?" Der folgende Code kombiniert zwei der vorherigen Antworten - die Idee, res [] zuzuweisen, und die Verwendung von signifi eher als rund.

glaciers <- data.frame(aspect=runif(20)*100, 
         sun.duration=runif(20)*10000, 
         latitude=runif(20)*10^9, 
         activity.level=sample(c('Active','Inactive','Relict'),20,replace=TRUE)) 
res <- by(glaciers[,1:3],glaciers$activity.level,mean) 
res[] <- lapply(res,signif,3) 
res 

Dieser Code wird die folgende Ausgabe erzeugt:

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
    3.66e+01  4.72e+03  4.56e+08 
------------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
    5.81e+01  5.28e+03  4.83e+08 
------------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
    6.08e+01  4.75e+03  3.98e+08