R 计算行平均数

R 计算行平均数,r,row,average,dataframe,mean,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

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

以下是使用包及其
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> 

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

您也可以使用
aggregate

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

Nico的答案看起来和我的答案一样,只是我会添加一个命名参数来传递给mean(),这样NA(在聚合列中)就不会破坏结果。(我无法判断OP是否询问by变量或Other变量中的NA已知或怀疑存在NA):

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

使用aggregate公式方法的另一种方法可能不同,因为默认值为na.action=na.omit:

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

您的
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)))
###使用来自Dirk答案的df,我们将数据拆分为站点日期组合

df.sp这是一个完整的新答案,完整的日志也涵盖了您的新规范:

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> 
R>行con-df-close(con)
R> df$pt图书馆(plyr)
R> newdf newdf$pt newdf
现场日期温度秒盐度深度浊度叶绿素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>

你需要一个
na.rm=TRUE
在你的
mean
调用那里,DirkThanks-Dirk,除了输出中缺少'Time'列之外,这一切都很好,所以我将其修改为:ddply(df,((Site,Date),function(x)mean(x[,-(1:2)],na.rm TRUE),但这会为'Time'下的值返回na,也可以平均时间吗?@Joey平均时间会给你带来什么价值?数据属于日平均值。我认为您首先需要将日期+时间组合为(解析的)POSIXct类型。超过这个你可以平均。你不能平均你现在拥有的东西,因为它是文本。这就是我跳过它的原因。我明白了……那我就试试看。我认为它会回到Posixct,以前没有使用过,但会尝试一下。谢谢:)和我对德克的评论一样。您需要在
FUN=means
之后添加
,na.rm=TRUE
以排除na值。你太棒了,抱歉我被完全卡住了!这太棒了,现在对我来说更有意义了…谢谢!!是的,现在结束了:)你无法想象我有多少次把自己的头撞在墙上a)因子/角色的事情,b)忘记了
as.POSIXct
之后的
strtime
和c)重新编译成
as.POSIXct
的该死的
origin=/code>。但幸运的是,我已经做了足够长的时间,最终它卡住了:)顺便说一句,这就是为什么完全可复制的例子在问题中更有用的原因之一。因此,不要只显示
print(df)
,而是显示生成或使用
dput(df)
的代码,该代码以ascii格式将其紧凑地序列化以供娱乐。
## 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)]
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>