2016-08-18 7 views
-2

Когда я понимаю COUNTIF и SUMIF на R, Я всегда использую sapply-функции и таблицы-функции, как это:Эффективный метод, как реализовать SUMIF и COUNTIF в R

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") 
) 

Есть ли эффективный метод?

ответ

1

Для эффективности мы можем использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df)), сгруппированный по 'a', мы получаем sum 'b' и количество элементов (.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)