如何计算R中数据帧中非零序列的统计数据

时间:2018-04-04 15:29:04

标签: r

我有一个包含序列的数据框如下:

r1=c(0,0,0,1.2,5,0.5,3.3,0,0,2.1,0.7,1,3.3,0,0,0,0,2.5,4.2,1,5.2,0,0,0,0)
r2=c(0,0,3.5,5.1,2.5,0,0,0,0.6,1.7,1.6,1.2,1.6,0,0,0,0,1.5,1.8,1.5,0,0,0,0,0)
r=as.data.frame(cbind(r1,r2))

我的实际数据包含更多列和行。对于每一列,我想获得每个非零值序列的最大值的最小值/最大值/平均值(基本统计量)。这意味着,考虑到一列,我提取其连续非0值的每个序列的最大值,然后我对它们执行统计。

1 个答案:

答案 0 :(得分:1)

在这里,我编写了一些函数来将向量分解为单个运行,提取所需的值(运行中的最大值),然后应用您要求的基本统计信息。可能有更优雅或更有效的方法。

r1=c(0,0,0,1.2,5,0.5,3.3,0,0, 2.1,0.7,1,3.3,0,0,0,0,2.5,4.2,1,5.2,0,0,0,0)
r2=c(0,0,3.5,5.1,2.5,0,0,0,0.6,1.7,1.6,1.2,1.6,0,0,0,0,1.5,1.8,1.5,0,0,0,0,0)
r=as.data.frame(cbind(r1,r2))

my.stats.fun <- function(col){
  # sub fuctions
  remove.successive.0s <- function(col){ 
    col  <- c(col, 0)
    i0   <- which(col==0)
    i00  <- i0[which(diff(i0)==1)]
    col2 <- col[-i00]
    if(col2[1]==0){ col2 <- col2[-1] }  # pops first 0
    return(col2)
  }
  run.indicator <- function(col){
    i0   <- which(col==0)
    lr   <- length(i0)
    runs <- rep(1:lr, times=c(i0-c(0,i0[-lr])))
    col  <- col[-i0]
    runs <- runs[-i0]
    return(list(values=col, index=runs))
  }
  basic.stats <- function(maxes){ 
    return(c(min=min(maxes), ave=mean(maxes), max=max(maxes)))
  }

  # apply functions
  col   <- remove.successive.0s(col)
  runs  <- run.indicator(col)
  maxes <- aggregate(runs$values, by=list(runs$index), max)[,2]
  stats <- basic.stats(maxes)
  return(stats)
}
sapply(r, my.stats.fun)
#      r1       r2
# min 3.3 1.700000
# ave 4.5 2.866667
# max 5.2 5.100000