2016-04-30 4 views
0

ich einen DatenrahmenWie gemeinsamen Werte der zwei Spalte zu verbinden, während die entsprechenden Werte der anderen Spalten von durchschnittlich

> df<- as.data.frame(cbind(a=c(rep(3, 5), rep(5, 5)), b=c(rep(1, 2), rep(2, 2), rep(3, 2), rep(4, 2), rep(5, 2)), c=(11:20))) 

> df 
    a b c 
1 3 1 11 
2 3 1 12 
3 3 2 13 
4 3 2 14 
5 3 3 15 
6 5 3 16 
7 5 4 17 
8 5 4 18 
9 5 5 19 
10 5 5 20 

ich kombinieren wollen die gemeinsamen Elemente der Spalte „a“ und „b“ wie die Zählung haben Funktion in plyr Paket tut:

> count(df, vars= c("a", "b")) 

Aber ich möchte auch meine Spalte „c“ halten, dass die Mittelwerte aller kombinierten Zeilen enthält. Wie weiter unten in der Spalte „m“ gezeigt

a b freq m 
1 3 1 2 11.5 
2 3 2 2 13.5 
3 3 3 1 15.0 
4 5 3 1 16.0 
5 5 4 2 17.5 
6 5 5 2 19.5 

Jeder Vorschlag, der kann ich tun, dass

Antwort

2

Wir können Gruppe von ‚a‘, ‚b‘, dann summarise die Anzahl der Zeilen als ‚Freq‘ zu schaffen und mean von 'c' als 'm'

library(dplyr) 
df %>% 
    group_by(a, b) %>% 
    summarise(freq = n(), m= mean(c)) 
# a  b freq  m 
# (dbl) (dbl) (int) (dbl) 
#1  3  1  2 11.5 
#2  3  2  2 13.5 
#3  3  3  1 15.0 
#4  5  3  1 16.0 
#5  5  4  2 17.5 
#6  5  5  2 19.5 
2

Oder verwenden data.table:

setDT(df) 

res <- df[,.(freq=.N, m=mean(c)),by=.(a,b)] 
res 

    a b freq m 
1: 3 1 2 11.5 
2: 3 2 2 13.5 
3: 3 3 1 15.0 
4: 5 3 1 16.0 
5: 5 4 2 17.5 
6: 5 5 2 19.5 
Verwandte Themen