2013-07-17 169 views
1

我看到ddply很好地總結和按變量分組。我想ddply掃描一個非常大的數據幀只有一次,並提供了一個計數(長度)多個變量。如何才能做到這一點?例如:ddply總結多個變量

inc <- c('inc123', 'inc332', 'inc231', 'inc492', 'inc872', 'inc983') 
hw <- c('ss23', 'ss43', 'ss98', 'ss98', 'ss23', 'ss23') 
app <- c('lkl', 'dsd', 'lkl', 'jhj', 'lkl', 'dsd') 
srvc <- c('rr', 'oo', 'rr', 'qq', 'qq', 'pp') 

df <- data.frame(inc, hw, app, srvc) 
ddply(df, .(hw), summarise, count = length(inc)) 

以上將給我獨特hw的數量計數。如果我做

ddply(df, .(hw, app, srvc), summarise, count = length(inc)) 

我的目標遺失─因爲ddply需要硬件,應用程序,SRVC的每一個「獨一無二」的組合,並計算這些。

有沒有辦法讓所有3個變量一次計數?期望得到的df是這樣的:(可能有不同的行數)。

hw count 
1 ss23  3 
2 ss43  1 
3 ss98  2 

    app count 
1 dsd  2 
2 jhj  1 
3 linux  1 
4 lkl  2 

    srvc count 
1 oo  1 
2 pp  1 
3 qq  2 
4 rr  2 
+0

它似乎並不兼容分裂和申請plyr的策略:你問在11克分裂data.frame沒有脫節的oups。 – baptiste

+0

我現在看到了。使用'獨特'也需要我爲每個變量運行一次。 – user1717931

回答

1

我不知道是什麼plyr內部的做法,但data.table只打算使用都在表達自己的列,有效掃描數據一次(逐列):

library(data.table) 
dt = data.table(df) 

lapply(c('hw', 'app', 'srvc'), function(name) dt[, .N, by = name]) 
+0

非常感謝Eddi和Dickoa。我喜歡他們的解決方案。 Data.Table雖然更快。 – user1717931

7

您可以使用plyr::count

require(plyr) 
llply(c("hw", "app", "srvc"), function(col) count(df, vars = col)) 
## [[1]] 
##  hw freq 
## 1 ss23 3 
## 2 ss43 1 
## 3 ss98 2 

## [[2]] 
## app freq 
## 1 dsd 2 
## 2 jhj 1 
## 3 lkl 3 

## [[3]] 
## srvc freq 
## 1 oo 1 
## 2 pp 1 
## 3 qq 2 
## 4 rr 2