Calcula medio de filas

votos
0

Tengo una trama de datos llamada antsque detalla varias entradas por sitio, se ve así:

  Site     Date     Time  Temp SpCond Salinity Depth Turbidity Chlorophyll
1   71 6/8/2010 14:50:35 14.32  49.88    32.66 0.397       0.0         1.3
2   71 6/8/2010 14:51:00 14.31  49.94    32.70 1.073       0.0         2.0
3   71 6/8/2010 14:51:16 14.32  49.95    32.71 1.034      -0.1         1.6
4   71 6/8/2010 14:51:29 14.31  49.96    32.71 1.030      -0.2         1.6
5   70 6/8/2010 14:53:55 14.30  50.04    32.77 1.002      -0.2         1.2
6   70 6/8/2010 14:54:09 14.30  50.03    32.77 0.993      -0.5         1.2

Sitios tienen diferente número de entradas, por lo general 3 pero a veces menos o más. Donde tanto la fecha y número de sitio partido me gustaría escribir una nueva trama de datos con una entrada por el sitio que detalla las lecturas medias / medias para cada parámetro. Me gustaría vacío o na células para ser omitidos del cálculo y la subsiguiente trama de datos.

No estoy seguro de si se trata de una función o una versión de rowMeans tal vez se aplica? Muy pegado, cualquier ayuda muy apreciada!

Publicado el 28/11/2010 a las 23:01
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
3

Esta es una manera mediante la plyr paquete y su ddply()función:

R> df
  Site     Date     Time  Temp SpCond Salinity Depth Turbidity Chlorophyll
1   71 6/8/2010 14:50:35 14.32  49.88    32.66 0.397       0.0         1.3
2   71 6/8/2010 14:51:00 14.31  49.94    32.70 1.073       0.0         2.0
3   71 6/8/2010 14:51:16 14.32  49.95    32.71 1.034      -0.1         1.6
4   71 6/8/2010 14:51:29 14.31  49.96    32.71 1.030      -0.2         1.6
5   70 6/8/2010 14:53:55 14.30  50.04    32.77 1.002      -0.2         1.2
6   70 6/8/2010 14:54:09 14.30  50.03    32.77 0.993      -0.5         1.2
R> library(plyr)
R> ddply(df, .(Site,Date), function(x) mean(x[,-(1:3)], na.rm=TRUE))
  Site     Date   Temp SpCond Salinity  Depth Turbidity Chlorophyll
1   70 6/8/2010 14.300 50.035   32.770 0.9975    -0.350       1.200
2   71 6/8/2010 14.315 49.933   32.695 0.8835    -0.075       1.625
R> 

He utilizado una función personalizada en el anonimato para saltar las tres primeras columnas.

Respondida el 28/11/2010 a las 23:17
fuente por usuario

votos
3

También puedes usar aggregate

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE)
Respondida el 28/11/2010 a las 23:36
fuente por usuario

votos
4

La respuesta de Nico mirado como el mío tendría la excepción de que yo hubiera añadido un argumento con nombre que se pasa a la media () de modo que la AN (en las columnas agregadas) no sería sabotear los resultados. (No podría decir si el PO estaba pidiendo que NA está en el por variables o en las variables otehr se sabe o se sospecha que tienen AN):

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE)

Es probable que tenga que ejecutar también agregados o Tapply llamadas en paralelo para contar el número de valores no-NA.

El otro método utilizando el método de la fórmula de agregado puede ser diferente desde na.action = na.omit es el valor predeterminado:

aggregate( . ~Site +Date, data=df,  FUN=mean, na.rm=TRUE)
Respondida el 28/11/2010 a las 23:59
fuente por usuario

votos
2

Usted fue cercano con rowMeans(), pero que necesita colMeans()en su lugar. Los otros han demostrado cómo utilizar incorporado o complemento en la funcionalidad y sin duda lo recomendaría usarlos. Sin embargo, podría ser útil para ver cómo hacer algo como esto a mano:

## using df from Dirk's answer, we split the data in Site Date combinations
df.sp <- with(df,
              split(data.frame(Temp, SpCond, Salinity, Depth, Turbidity,
                               Chlorophyll),
                    list(Site = Site, Date = Date)))
## The above gives  a list of data frames one per date-site combo,
## to which we apply the colMeans() function
df.mean <- data.frame(t(sapply(df.sp, colMeans)))

En este punto tenemos que hacer algunos obra extra si quieres que la salida sea tan bonita como las respuestas de los otros:

## Process the rownames on df.mean
name.parts <- strsplit(rownames(df.mean), "\\.")
## pull out the Site part (before the '.')
df.mean <- within(df.mean, Site <- as.numeric(sapply(name.parts, `[`, 1)))
## pull out the Date part (after the '.')
df.mean <- within(df.mean, Date <- sapply(name.parts, `[`, 2))
## rearrange the columns
df.mean <- df.mean[, c(7:8,1:6)]

Tenga en cuenta una vez más , para la mayoría de los casos se debe utilizar las funciones enlatados como se describe por las otras respuestas. A veces puede ser más rápido para cocinar su propia solución sin embargo, y lo anterior podría actuar como una guía para lograr esto.

Respondida el 29/11/2010 a las 10:24
fuente por usuario

votos
2

He aquí una nueva respuesta completa con un registro completo también cubre su nueva especificación:

R> Lines <- "  Site     Date     Time  Temp SpCond Salinity Depth Turbidity Chlorophyll
+ 71 6/8/2010 14:50:35 14.32  49.88    32.66 0.397       0.0         1.3
+ 71 6/8/2010 14:51:00 14.31  49.94    32.70 1.073       0.0         2.0
+ 71 6/8/2010 14:51:16 14.32  49.95    32.71 1.034      -0.1         1.6
+ 71 6/8/2010 14:51:29 14.31  49.96    32.71 1.030      -0.2         1.6
+ 70 6/8/2010 14:53:55 14.30  50.04    32.77 1.002      -0.2         1.2
+ 70 6/8/2010 14:54:09 14.30  50.03    32.77 0.993      -0.5         1.2
+ "
R> con <- textConnection(Lines)
R> df <- read.table(con, sep="", header=TRUE, stringsAsFactors=FALSE)
R> close(con)
R> df$pt <- as.POSIXct(strptime(paste(df$Date, df$Time), "%m/%d/%Y %H:%M:%S"))
R> library(plyr)
R> newdf <- ddply(df, .(Site,Date), function(x) mean(x[,-(1:3)], na.rm=TRUE))
R> newdf$pt <- as.POSIXct(newdf$pt, origin="1970-01-01")
R> newdf
  Site     Date  Temp SpCond Salinity  Depth Turbidity Chlorophyll                  pt
1   70 6/8/2010 14.30  50.03    32.77 0.9975    -0.350       1.200 2010-06-08 20:54:02
2   71 6/8/2010 14.32  49.93    32.70 0.8835    -0.075       1.625 2010-06-08 20:51:05
R> 
Respondida el 02/12/2010 a las 16:36
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more