我想按块总结数字:
以下是示例数据
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
答案 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]
对我而言,理解起来更为直接。