0

我有一个名为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 的一个版本?非常卡住,非常感谢任何帮助!

4

5 回答 5

4

Nico 的答案看起来像我的答案,只是我会添加一个命名参数以传递给 mean() 以便 NA(在聚合列中)不会破坏结果。(我不知道 OP 是否在询问 by 变量或 otehr 变量中的 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)
于 2010-11-28T22:59:45.917 回答
3

你也可以使用aggregate

aggregate(df, by=list(df$Site, df$Date), FUN=mean, na.rm=TRUE)
于 2010-11-28T22:36:00.740 回答
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> 

我使用自定义匿名函数跳过前三列。

于 2010-11-28T22:17:00.167 回答
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)]

再次注意,在大多数情况下,您应该使用其他答案所述的罐装函数。然而,有时编写自己的解决方案可能会更快,以上内容可能会作为实现这一目标的指南。

于 2010-11-29T09:24:15.113 回答
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> 
于 2010-12-02T15:36:53.733 回答