如何根据最大值分割数据

时间:2017-03-23 20:51:24

标签: r split

分析我的钟形数据,我想分组前后峰值。我想选择在最大值之前的那些日期的值(包括峰值处的值)。所以在我的例子中,它必须在第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

有解决方案吗? 谢谢!

1 个答案:

答案 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)