2016-03-08 50 views
2

我想通過塊來概括數字:總結號碼由R中塊

下面是一個示例數據

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 

我想獲得

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

,而無需使用任何包。如何與R做到這一點?

或者,如果我能得到

 n/low n/high sum 
[1,] 0  3 4.8 
[2,] 2  0 4 
[3,] 0  1 2.1 
[4,] 2  0 3.5 
+2

請說明你到目前爲止嘗試過的。 – Andru

+0

我試過了(),aggregate()等。但我沒有找到一個好的方法來應用這個問題的這些功能。所以基本上我完全不知道 – Yukun

+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回答。

+0

你可以使用'base R'或'data.table'。有了'dplyr',你既可以與data.table結合使用,也可以使用索引方法http://stackoverflow.com/questions/33507868/is-there-a-dplyr-equivalent-to-data-tablerleid –

+0

什麼是df1在這裏? – Yukun

+0

這就是你輸入數據幀名稱的地方 –

3

一個類似的選項,也使用聚合;

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

好的解決方案。也可以使用公式法:'aggregate(.g,cbind(df,g = c(0,cumsum(abs(diff(df $ low))))​​),sum)[ - 1]'。 – bgoldst

+0

非常感謝!這些解決方案打開了我的眼睛! – Yukun

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) 

但是我收到了一些警告,但我認爲這不是問題。

+0

只是一個建議,你的代碼可以通過一些空間變得更易讀。 – Gregor

+0

什麼樣的空間? – sanmath

+0

空格。 R的常用樣式指南(例如[Google](https://google.github.io/styleguide/Rguide.xml)或[Hadley Wickham's](http://adv-r.had.co.nz/Style)。 )建議在每個逗號後面以及所有二元運算符(特別是賦值運算符「<-'」)之間使用空格。而不是'if(data [i,1:2] == data [i-1,1:2]){',你應該有'if(data [i,1:2] == data [i - 1 ,1:2]){'。它使讀起來更容易,更快更好理解。 – Gregor

0

我也發現了類似的選擇:

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

對我來說是更直接的瞭解。