R中sumif和countif的高效实现方法

Efficient method how to realize sumif and countif in R

当我用R实现countif和sumif时, 我总是像这样使用 sapply-function 和 table-function:

symbol = letters[sample(1:3, 5, replace=TRUE)]
df=data.frame(a=symbol,
          b=seq_len(length(symbol)))


#sumif
summary=data.frame(key=unique(df$a))
summary$sum=sapply(
  seq_len(nrow(summary)),
  function(i) with(df, sum(df$b[a==summary$key[i]]))
)

#countif
countif = data.frame(
  key=names(table(df$a)),
  count=as.vector(table(df$a))
)

summary = merge(
  summary,
  countif,
  c("key")
)

有什么有效的方法吗?

我们可以使用 data.table 来提高效率。将'data.frame'转换为'data.table'(setDT(df)),按'a'分组,得到'b'的sum和元素个数(.N).

library(data.table)
setDT(df)[, .(sum = sum(b), count = .N), .(key = a)]
#    key sum count
#1:   c   1     1
#2:   a   6     2
#3:   b   8     2

或者另一种选择是dplyr

library(dplyr)
df %>%
   group_by(key = a) %>%
   summarise(sum = sum(b), count = .N)