2010-11-05 22 views
8

分類彙總計算我有900000行和11列中R.數據幀的列名和類型如下:中的R

column name: date/mcode/mname/ycode/yname/yissue/bsent /breturn/tsent /treturn/csales 
type:  Date/Char/Char/Char/Char/Numeric/Numeric/Numeric/Numeric/Numeric/Numeric 

我要計算的小計。例如,我想計算yname每次更改的總和,並將小計添加到所有數值變量。有160個不同的ynames,所以結果表應該告訴我每個yname的小計。我還沒有對數據進行排序,但這不是問題,因爲我可以以任何我想要的方式對數據進行排序。以下是我的數據摘錄:

   date  mcode mname   ycode yname yissue bsent breturn tsent treturn csales 
417572 2010-07-28  45740 ENDPOINT A  5772 XMAG 20100800  7  0  7  0  0 
417573 2010-07-31  45740 ENDPOINT A  5772 XMAG 20100800  0  0  0  0  1 
417574 2010-08-04  45740 ENDPOINT A  5772 XMAG 20100800  0  0  0  0  1 
417575 2010-08-14  45740 ENDPOINT A  5772 XMAG 20100800  0  0  0  0  1 
417576 2010-08-26  45740 ENDPOINT A  5772 XMAG 20100800  0  4  0  0  0 
417577 2010-07-28  45741 ENDPOINT L  5772 XMAG 20100800  2  0  2  0  0 
417578 2010-08-04  45741 ENDPOINT L  5772 XMAG 20100800  2  0  2  0  0 
417579 2010-08-26  45741 ENDPOINT L  5772 XMAG 20100800  0  4  0  0  0 
417580 2010-07-28  46390 ENDPOINT R  5772 XMAG 20100800  3  0  3  0  1 
417581 2010-07-29  46390 ENDPOINT R  5772 XMAG 20100800  0  0  0  0  2 
417582 2010-08-01  46390 ENDPOINT R  5779 YMAG 20100800  3  0  3  0  0 
417583 2010-08-11  46390 ENDPOINT R  5779 YMAG 20100800  0  0  0  0  1 
417584 2010-08-20  46390 ENDPOINT R  5779 YMAG 20100800  0  0  0  0  1 
417585 2010-08-24  46390 ENDPOINT R  5779 YMAG 20100800  2  0  2  0  1 
417586 2010-08-26  46390 ENDPOINT R  5779 YMAG 20100800  0  2  0  2  0 
417587 2010-07-28  46411 ENDPOINT D  5779 YMAG 20100800  6  0  6  0  0 
417588 2010-08-08  46411 ENDPOINT D  5779 YMAG 20100800  0  0  0  0  1 
417589 2010-08-11  46411 ENDPOINT D  5779 YMAG 20100800  0  0  0  0  1 
417590 2010-08-26  46411 ENDPOINT D  5779 YMAG 20100800  0  4  0  4  0 

我應該在這裏使用什麼函數?也許像SQL group by

+1

如果您向我們提供了一段數據或您實際需要的更多詳細信息,那將會容易得多。當你不提供自己的例子時,你的請求中有一定程度的諷刺意味。儘管如此,很可能大多數R大師不會使用Excel,並且很可能在很長一段時間內沒有這樣做,所以不要以爲我們知道你說「像Excel一樣」就是什麼意思。 'yname'是否分類?因爲那麼它將是R中的一個聚合任務(即,您希望由yname定義的組的數字總和)。 – 2010-11-05 09:07:43

+0

@Gavin Simpson:我已根據您的評論更新了我的問題。 – 2010-11-05 09:34:50

+1

這裏有一些相關的問題:http://stackoverflow.com/search?q=%5Br%5D+%22group+by%22 – 2010-11-05 11:49:38

回答

10

好的。假設你的數據在一個名爲foo數據幀:

> head(foo) 
      date mcode  mname ycode yname yissue bsent breturn tsent 
417572 2010/07/28 45740 ENDPOINT A 5772 XMAG 20100800  7  0  7 
417573 2010/07/31 45740 ENDPOINT A 5772 XMAG 20100800  0  0  0 
417574 2010/08/04 45740 ENDPOINT A 5772 XMAG 20100800  0  0  0 
417575 2010/08/14 45740 ENDPOINT A 5772 XMAG 20100800  0  0  0 
417576 2010/08/26 45740 ENDPOINT A 5772 XMAG 20100800  0  4  0 
417577 2010/07/28 45741 ENDPOINT L 5772 XMAG 20100800  2  0  2 
     treturn csales 
417572  0  0 
417573  0  1 
417574  0  1 
417575  0  1 
417576  0  0 
417577  0  0 

,那麼這將做數字列的聚集在你的數據:

> aggregate(cbind(bsent, breturn, tsent, treturn, csales) ~ yname, data = foo, 
+   FUN = sum) 
    yname bsent breturn tsent treturn csales 
1 XMAG 14  8 14  0  6 
2 YMAG 11  6 11  6  5 

這是使用數據您在包含代碼段的問:我使用公式接口aggregate(),在這種情況下更好一些,因爲您不需要所有想要聚合的變量名上的foo$位。如果你在你的整個數據集丟失的數據(NA),那麼你就需要添加一個額外的參數na.rm = TRUE將獲得通過,以sum(),像這樣:

> aggregate(cbind(bsent, breturn, tsent, treturn, csales) ~ yname, data = foo, 
+   FUN = sum, na.rm = TRUE) 
2

您可以使用aggregate

例如,假設你有

val = rnorm(50) 
name = rep(letters[1:5], each=10) 
data <- data.frame(val, name) 

然後,你可以做

aggregate(data$val, by=list(data$name), FUN=sum) 
4

還是plyr庫,它很容易擴展到其他數據類:

> library(plyr) 
> result.2 <- ddply(df$a, .(df$b), sum) 
> result.2 
    df.b V1 
1 down 30 
2 up 25 
4

您還可以使用xtabstapply

xtabs(cbind(bsent, breturn, tsent, treturn, csales) ~ yname, data) 

tapply(data$bsent, data$yname, sum) 
2

有一個名爲sqldf的R包,使您可以在R data.frames上使用SQL命令。 除了像你已經說過的那樣,GROUP BY會很好。您可以輕鬆地將數據存儲在本地MySQL數據庫中,並使用RMySQL包連接到R(也可以使用大多數其他DBMS,但MySQL是最容易設置的)。

據我可以判斷,plyr也是一個很好的包裝。但是從你詢問的方式和將你的問題與GROUP BY進行比較的方式來看,我想你知道一些關於SQL的知識,所以使用它可能會更容易。有一些舒適的函數,比如dbReadTable,如果數據變得更大,您可以只選擇數據的子部分,以便只用真正需要的分析來運行分析。

3

如果你的數據很大且速度很重要,我會推薦使用R函數rowsum,這個速度要快很多。我申請的3種方法(F1 =骨料,F2 = ddply,F3 = tapply)在答覆建議將其與F4 = rowsum比較和這裏是我發現:

test replications elapsed relative 
4 f4()   100 0.033  1.00 
3 f3()   100 0.046  1.39 
1 f1()   100 0.165  5.00 
2 f2()   100 0.605 18.33 

我在下面,如果加了我的代碼有人想更詳細地探索。

library(plyr); 
library(rbenchmark); 

val = rnorm(50); 
name = rep(letters[1:5], each = 10); 
data = data.frame(val, name); 

f1 = function(){aggregate(data$val, by=list(data$name), FUN=sum)} 
f2 = function(){ddply(data, .(name), summarise, sum = sum(val))} 
f3 = function(){tapply(data$val, data$name, sum)} 
f4 = function(){rowsum(x = data$val, group = data$name)} 

benchmark(f1(), f2(), f3(), f4(), 
      columns=c("test", "replications", "elapsed", "relative"), 
      order="relative", replications=100)