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