2009-09-29 15 views
7

Sto cercando di arrotondare un'uscita da una semplice funzione by() in R. Questo è quello che ho:Arrotondamento dell'output per funzione 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 

Come posso ottenere la mia uscita per arrotondare a dire 5 cifre decimali, e ancora mantenere i fattori?

Ho provato: round(by(glaciers[,1:3],glaciers$activity.level,mean),5) ma ho ricevuto un errore: Non-numeric argument to mathematical function.

+2

solo per aggiungere: l'uscita della funzione() è un "di" oggetto, quindi non è possibile fare cose come round() ad esso. – Shane

risposta

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

UPDATE

Ecco un esempio di lavoro:

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, Ho anche provato questo metodo, ma sto ancora ricevendo numeri non arrotondati con esponenti come sopra. Non sono sicuro del motivo per cui la funzione round() sta attraversando. –

+0

Ho giocato con questo di più e ho scoperto che se avessi fatto un round di .5, allora avrebbe effettivamente arrotondato, ma a solo 1 decimale. Voglio arrotondare per dire 3-5 cifre decimali, ma l'utilizzo del numero intero non sembra farlo. –

+0

Non so cosa stai facendo. Ho aggiornato la mia risposta per includere un esempio funzionante. –

10

Se avete già l'output salvato in una variabile, ad esempio x:

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

applicare Poi round() per ogni elemento (l'output di by() in questo caso è una lista).

x[] <- lapply(x,round,5) 
x 

riassegnazione di x [] anziché x permette di conservare x attributi ad esso da da().

Modifica: round() modifica effettivamente il valore delle variabili ma viene disaccoppiato dalla stampa. Se si desidera eliminare il formato di output notazione scientifica, utilizzare format = argomento "f" per formatC()

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

Quindi la correzione per l'espressione originariamente postato sarebbe

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

Stephen, Ho provato questo metodo ma sto ancora ricevendo numeri circoscritti con uscite esponenziali come sopra. Qualche idea? –

1

Vuoi arrotondare o semplicemente troncare il numero di cifre mostrato? Se quest'ultimo, utilizzare le opzioni (cifre = 3) o qualsiasi altra cosa.

> 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

avere solo un paio di minuti, ma si potrebbe provare a guardare le format(), formatC() e prettyNum() funzioni. I loro file di aiuto mi sembrano incomprensibili in questo momento, ma non ho dormito molto. Tuttavia, ho usato una di queste funzioni - molto probabilmente formatC() - per un report Sweave alcuni mesi fa in cui avevo bisogno di numeri formattati in modo specifico.

+0

Per chiarire: è necessario inserirlo nella funzione by() come hanno fatto Rob e Stephen con round(). –

6

round() non ha senso in questo caso, dal momento che si sta lavorando con numeri molto grandi. Si desidera utilizzare il comando format() e scegliere il numero di cifre da visualizzare. Per esempio, per mostrare 3 cifre significative:

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

hai chiesto "Come posso avere la mia uscita per arrotondare a dire 5 cifre decimali?" ma penso che volevi dire "Come posso far sì che la mia produzione mostri 6 cifre significative?" Il codice seguente combina due delle risposte precedenti: l'idea di riassegnare a res [] e l'uso di signif anziché round.

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 

Questo codice produce il seguente output:

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