Рассчитать средние значения рядов - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть фрейм данных под названием ants с подробным описанием нескольких записей на сайт, выглядит следующим образом:

  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

Сайты имеют разное количество записей, обычно 3, но иногда меньше или больше. Там, где совпадают и дата, и номер сайта, я хотел бы написать новый фрейм данных с одной записью на сайт, в которой указаны средние / средние значения для каждого параметра. Я хотел бы, чтобы пустые или "na" ячейки были исключены из расчета и последующего кадра данных.

Я не уверен, что это функция применения или версия rowMeans? Очень застрял, любая помощь высоко ценится!

Ответы [ 5 ]

4 голосов
/ 29 ноября 2010

Ответ Нико выглядел так, как будто бы мой, за исключением того, что я бы добавил именованный аргумент для передачи в Mean (), чтобы NA (в агрегированных столбцах) не саботировали результаты.(Я не мог сказать, спрашивал ли OP, что NA в переменных by или в переменных otehr были известны или подозревались в наличии NA):

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

Возможно, вам также понадобится выполнить агрегированные или косвенные вызовыпараллельно для подсчета количества значений, не относящихся к NA.

Другой метод, использующий метод формулы агрегата, может отличаться, поскольку по умолчанию используется na.action = na.omit:

aggregate( . ~Site +Date, data=df,  FUN=mean, na.rm=TRUE)
3 голосов
/ 29 ноября 2010

Вы также можете использовать aggregate

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE)
3 голосов
/ 29 ноября 2010

Вот один из способов использования пакета plyr и его функции ddply():

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> 

Я использовал собственную анонимную функцию, чтобы пропустить первые три столбца.

2 голосов
/ 02 декабря 2010

Вот полный новый ответ с полным журналом, также охватывающим вашу новую спецификацию:

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> 
2 голосов
/ 29 ноября 2010

Вы были близки с rowMeans(), но вместо этого вам нужно colMeans(). Другие показали, как использовать встроенные или дополнительные функции, и я, безусловно, рекомендую вам их использовать. Однако, может быть полезно посмотреть, как сделать что-то подобное вручную:

## 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)))

На данный момент нам нужно провести дополнительную уборку, если вы хотите, чтобы результат был хорошим, как ответы других:

## 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)]

Примечание снова , в большинстве случаев вам следует использовать стандартные функции, как описано в других ответах. Однако иногда может быть быстрее приготовить собственное решение, и приведенное выше может служить руководством для достижения этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...