2009-09-29 13 views
7

Estoy tratando de redondear una salida desde una función simple by() en R. Esto es lo que tengo:Salida de redondeo desde por función en 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 

¿Cómo puedo hacer que mi salida para redondear decir 5 decimales, y aún así mantener los factores?

He intentado: round(by(glaciers[,1:3],glaciers$activity.level,mean),5) pero me sale un error: Non-numeric argument to mathematical function.

+2

sólo para añadir: la salida de la función de() es un "por" objeto, por lo que no puede hacer cosas como redonda() lo. – Shane

Respuesta

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

ACTUALIZACIÓN

Aquí está un ejemplo de trabajo:

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, También probé este método pero sigo obteniendo números no redondeados con exponentes como los anteriores. No estoy seguro de por qué está pasando la función round(). –

+0

Jugué con esto más y descubrí que si doy una vuelta alrededor de .5, digo que realmente redondeará, pero con solo 1 lugar decimal. Quiero redondear para decir 3-5 lugares decimales pero usar el número completo no parece hacer esto. –

+0

No sé lo que estás haciendo. He actualizado mi respuesta para incluir un ejemplo de trabajo. –

10

Si ya tiene la salida guarda en una variable, digamos x:

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

A continuación, se aplica round() para cada elemento (la salida de by() en este caso es una lista).

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

reasignar a x [] en lugar de x permite x para retener atributos adjuntos a la misma desde por().

Editar: round() en realidad cambia el valor de las variables pero está desacoplado de su impresión. Si desea suprimir el formato de salida notación científica, utilizar el formato = argumento "f" para formatC()

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

Así que la corrección de la expresión originalmente publicado habría

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

Stephen, Intenté este método pero sigo sin obtener - números redondeados con salidas de exponente como arriba. ¿Algunas ideas? –

1

¿Quieres redondo o simplemente truncar la cantidad de dígitos que se muestran? Si es este último, use opciones (dígitos = 3) o lo que sea.

> 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

sólo tienen un par de minutos, pero es posible que intente buscar en las format(), formatC() y prettyNum() funciones. Sus archivos de ayuda me parecen un galimatías en este momento, pero no he dormido mucho. Sin embargo, utilicé una de estas funciones, muy probablemente formatC(), para un informe de Sweave hace algunos meses en el que necesitaba números con formato muy específico.

+0

Para aclarar: necesitaría ponerlo en la función by() como lo han hecho Rob y Stephen con round(). –

6

round() no tiene sentido en este caso, ya que está trabajando con números muy grandes. Desea utilizar el comando format() y elegir cuántos dígitos mostrar. Por ejemplo, para mostrar 3 dígitos significativos:

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

Se preguntó "¿Cómo puedo obtener mi salida para redondear decir 5 decimales?" pero creo que lo que usted quiso decir fue "¿Cómo puedo obtener mi producción para mostrar, digamos, 6 cifras significativas?" El siguiente código combina dos de las respuestas anteriores: la idea de reasignar a res [] y el uso de signif en lugar de 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 

Este código genera el siguiente resultado:

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