我的数据框简化如下:
Day Place dendrometer max
1 1 1 4684
2 1 1 4831
1 1 2 2486
2 1 2 2596
1 2 1 6987
2 2 1 6824
我需要每个dendrometer的第一个元素作为NA,因此每次R计算新的dendrometer(独立于地点)的“max”时,从NA开始,如下所示:
Day Place dendrometer max
1 1 1 NA
2 1 1 4831
1 1 2 NA
2 1 2 2596
1 2 1 NA
2 2 1 6824
您是否也可以让我知道我可以计算每个环中每个dendrometer的最大列的平均值(sapply,aggregate?)而不是计算整个最大列的平均值? 注意:dendro 1就位1与dendro 1就位2不同,我需要不同的信息为每一个
答案 0 :(得分:2)
您是否始终只在一个地方测量一个dendrometer?如果是这样,那么您可以将每个其他值设置为NA:
#x is your data.frame
x<-read.table("clipboard",header=TRUE)
x[seq(1,nrow(x),by=2),4]<-NA
,最大值是非NA值
x[seq(2,nrow(x),by=2),4]
如果您的数据更复杂,这应该有效:
dup<-duplicated(x[,2:3]) #find the non-unique cases
x[!dup,4]<-NA #set the first measurements as NA
tapply(x[dup,4],which(dup),max) #compute max from others.
请注意,为了计算平均值,您不需要将第一个测量值设置为NA。
答案 1 :(得分:2)
library(data.table)
myDat <- data.table(myDat, key="Day")
# using the `mult` argument, make the first instance of each Day NA
myDat[.(Day), dendrometer := NA, mult="first"]
# add mean
myDat[, mean := mean(dendrometer, na.rm=TRUE), by=Day]
# add max
myDat[, max := max(dendrometer, na.rm=TRUE), by=Day]
> myDat
Day Place dendrometer mean max
1: 1 1 NA 3304.333 4831
2: 1 1 4831 3304.333 4831
3: 1 2 2486 3304.333 4831
4: 1 2 2596 3304.333 4831
5: 2 1 NA 6824.000 6824
6: 2 1 6824 6824.000 6824
read.table(text=
"Day Place dendrometer
1 1 4684
1 1 4831
1 2 2486
1 2 2596
2 1 6987
2 1 6824", header=TRUE, stringsAsFactors=FALSE) -> myDat
答案 2 :(得分:0)
首先,使用max
计算tapply
的平均值。
dat <- transform(dat,
mean = tapply(max, c(0, cumsum(abs(diff(dendrometer)))), mean))
Day Place dendrometer max mean
1 1 1 1 4684 4757.5
2 2 1 1 4831 2541.0
3 1 1 2 2486 6905.5
4 2 1 2 2596 4757.5
5 1 2 1 6987 2541.0
6 2 2 1 6824 6905.5
您可以使用diff
功能查找dendrometer
和is.na<-
功能之间的差异,将max
中的值替换为NA
。
is.na(dat$max) <- c(TRUE, diff(dat$dendrometer) != 0)
Day Place dendrometer max mean
1 1 1 1 NA 4757.5
2 2 1 1 4831 2541.0
3 1 1 2 NA 6905.5
4 2 1 2 2596 4757.5
5 1 2 1 NA 2541.0
6 2 2 1 6824 6905.5