计算行的方式

时间:2010-11-28 22:01:30

标签: r row average dataframe mean

我有一个名为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”单元格。

我不确定这是一个apply函数还是rowMeans的版本?非常困难,任何帮助非常感谢!

5 个答案:

答案 0 :(得分:4)

Nico的回答看起来像我的回答,除了我会添加一个命名参数传递给mean(),以便NA(在聚合列中)不会破坏结果。 (我无法判断OP是否在通过变量或其他变量中的NA已知或怀疑有NA):

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

您可能还需要并行运行聚合或tapply调用来计算非NA值的数量。

使用聚合公式方法的另一种方法可能会有所不同,因为na.action = na.omit是默认值:

aggregate( . ~Site +Date, data=df,  FUN=mean, na.rm=TRUE)

答案 1 :(得分:3)

以下是使用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 :(得分:3)

您也可以使用aggregate

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

答案 3 :(得分:2)

您与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)]

再次注意 ,对于大多数情况,您应该使用其他答案所描述的固定功能。然而,有时烹饪自己的解决方案可能会更快,而上述内容可能会成为实现这一目标的指南。

答案 4 :(得分:2)

这是一个完整的新答案,其中包含完整的日志,涵盖了您的新规范:

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>