2016-08-18 2 views
-2

zu realisieren, wenn ich countIf und SUMIF von R realisieren, ich immer sapply-Funktion und Tisch-Funktion wie folgt verwendet werden:effiziente Methode, wie SUMIF und countIf in 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") 
) 

Gibt es eine effiziente Methode?

Antwort

1

Wir können data.table für Effizienz verwenden. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'a', erhalten wir die sum von 'b' und die Anzahl der Elemente (.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 

Oder eine andere Option ist dplyr

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