1

我看到 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))

以上将给我计算唯一硬件的数量。如果我做

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
4

2 回答 2

8

你可以使用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
于 2013-07-17T21:39:47.190 回答
1

我不知道plyr内部做什么,但data.table只会使用表达式本身中的列,只有效地扫描数据一次(逐列):

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

lapply(c('hw', 'app', 'srvc'), function(name) dt[, .N, by = name])
于 2013-07-17T21:25:47.583 回答