分析我的钟形数据,我想分组前后峰值。我想选择在最大值之前的那些日期的值(包括峰值处的值)。所以在我的例子中,它必须在第1,2和3天
示例:
check<-data.frame(day = c(1:5), A = c(0.2,0.8,1.6,1.0,0.4),
B = c(0.3,0.7,1.3,0.7,0.3))
library(reshape2)
check_m<-melt(check, id=c("day"))
colnames(check_m)<-c("day","group","value")
以下是同事提供的解决方案:
befmax<-NULL
lll<-unique(check_m$group)
for (i in 1:length(lll)){
xxx<-subset(check_m, check_m$group==lll[i])
maxi<-subset(xxx, value==max(xxx$value))
xxx$bef<-(xxx$day<=maxi$day)
befmax<-rbind(befmax,xxx)
}
但它不适用于实际数据集中提供的NA。添加na.rm=T
无济于事。
它会返回错误提示:
> Error in `$<-.data.frame`(`*tmp*`, "bef", value = logical(0)) :
> replacement has 0 rows, data has 5
有解决方案吗? 谢谢!
答案 0 :(得分:0)
也许我们可以使用base R
i1 <- with(check_m, ave(value, group, FUN = function(x) {
x1 <- c(-Inf, diff(x))
c(0, cumsum(x1==max(x1))[-length(x)])}))
split(check_m, list(check_m$group, i1), drop = FALSE)