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>