R中的块总结数字

时间:2016-03-08 21:38:24

标签: r sum

我想按块总结数字:

以下是示例数据

  var selectedOwners = [{"fullName":"Johnson, Rocio","workerKey":3506},{"fullName":"Johnson, John S.","workerKey":571}];

   $scope.deleteOwner = function(dataItem){
              angular.forEach(selectedOwners,function(val,index){
                if(val === dataItem){
                  selectedOwners.splice(index,1);
                }
              })
            }

我想要

 data=matrix(c(0,0,0,1,1,0,1,1,1,1,1,0,0,1,0,0,1.2,2.3,1.3,1.5,2.5,2.1,2.3,1.2),
             ncol=3,dimnames=list(c(),c("low","high","time")))

     low high time
 [1,]   0    1  1.2
 [2,]   0    1  2.3
 [3,]   0    1  1.3
 [4,]   1    0  1.5
 [5,]   1    0  2.5
 [6,]   0    1  2.1
 [7,]   1    0  2.3
 [8,]   1    0  1.2

不使用任何包裹。如何用R?

做到这一点

或者如果我能得到

       n  sum
 [1,]  3  4.8
 [2,]  2  4
 [3,]  1  2.1
 [4,]  2  3.5

4 个答案:

答案 0 :(得分:9)

不确定为什么对包有约束。他们可以使这更容易。我们可以使用前两列的唯一组合来创建索引。然后与索引进行聚合以进行分组。添加一行以设置名称和数据框结构:

ind <- with(rle(do.call(paste, df1[1:2])), rep(1:length(values), lengths))
a <- aggregate(df1$time, list(ind), function(x) c(length(x), sum(x)))[-1]
setNames(do.call(data.frame, a), c("n", "sum"))

  n sum
1 3 4.8
2 2 4.0
3 1 2.1
4 2 3.5

借助data.table

的帮助来说明这是多么简单
library(data.table)
setDT(df1)[, .(.N, sum(time)), by=rleid(low, high)]

<强>更新

关于后续问题,请参阅评论中的@bgoldst答案。

答案 1 :(得分:3)

类似的选项,也使用聚合;

aggregate(cbind(n=1,sum=df$time), 
          by=list(c(0, cumsum(abs(diff(df$low))))), 
          FUN=sum)[-1]

答案 2 :(得分:0)

我已经解决了这个问题,我认为这有点复杂,但它确实有效。

好吧,我已经使用循环生成了每一列。

1)我已计算每次改变

 data<-data.frame(data)
 ind1<-vector(mode="numeric", length=0)
 ind1[1]<-1
 for(i in c(2:8))
   ind[i]<-ifelse(data[i,1:2]==data[i-1,1:2],ind1[i-1],ind1[i-1]+1)

然后我也用循环生成了总和。

ind<-c(1.2,0,0,0)
k<-1

for(i in c(2:8)){
  if(data[i,1:2]==data[i-1,1:2]){
     ind2[k]<-ind2[k]+data[i,3]
  }else{
      k<-k+1
      ind2[k]<-ind2[k]+data[i,3]
}}


  result<-cbind(data.frame(table(ind1))$Freq,ind2)

但是我收到了一些警告,但我认为这不是问题。

答案 3 :(得分:0)

我也找到了类似的选项:

 aggregate(df,list(c(0,cumsum(abs(diff(df$low))))),sum)[-1]

对我而言,理解起来更为直接。