2015-03-25 17 views
5

Próbuję znaleźć najczęstszą wartość według grupy. W poniższym przykładzie dataframe:Najczęstsza wartość (tryb) według grupy

df<-data.frame(a=c(1,1,1,1,2,2,2,3,3),b=c(2,2,1,2,3,3,1,1,2)) 
> df 
    a b 
1 1 2 
2 1 2 
3 1 1 
4 1 2 
5 2 3 
6 2 3 
7 2 1 
8 3 1 
9 3 2 

ja chcemy dodać w kolumnie „C”, która ma najbardziej występującą wartość „b”, jeżeli jego wartość jest podzielone przez „a”. Chciałbym następujące wyjście:

> df 
    a b c 
1 1 2 2  
2 1 2 2  
3 1 1 2  
4 1 2 2  
5 2 3 3  
6 2 3 3  
7 2 1 3  
8 3 1 1 
9 3 2 1  

Próbowałem przy użyciu tabeli i tapply, ale nie rozumiem. Czy istnieje szybki sposób na zrobienie tego?
Dzięki!

+3

Jest to bardzo związane z [this] (http://stackoverflow.com/questions/2547402/standard-library-function-in-r-for-finding-the-mode) –

Odpowiedz

5

Opierając się na Davids komentuje swoje rozwiązanie jest następujące:

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

library(dplyr) 
df %>% group_by(a) %>% mutate(c=Mode(b)) 

Pamiętaj jednak, że dla remisu, gdy df$a to 3, a następnie tryb dla b to 1.

2

Mogliśmy dostać 'Mode' z 'B' spis 'a' używając ave

Mode <- function(x) { 
ux <- unique(x) 
ux[which.max(tabulate(match(x, ux)))] 
} 

df$c <- with(df, ave(b, a, FUN=Mode)) 
df$c 
#[1] 2 2 2 2 3 3 3 1 1 

lub korzystając data.table

library(data.table) 
setDT(df)[, c:= Mode(b), by=a][] 
0

tu jest sposób, który wykorzystuje zasadę R table obliczyć kartę poprzeczny max.col znaleźć trybu w każdej grupie, a rep wraz z rle wypełnić trybu między grupami.

# calculate a cross tab, frequencies by group 
myTab <- table(df$a, df$b) 
# repeat the mode for each group, as calculated by colnames(myTab)[max.col(myTab)] 
# repeating by the number of times the group ID is observed 
df$c <- rep(colnames(myTab)[max.col(myTab)], rle(df$a)$length) 

df 
    a b c 
1 1 2 2 
2 1 2 2 
3 1 1 2 
4 1 2 2 
5 2 3 3 
6 2 3 3 
7 2 1 3 
8 3 1 2 
9 3 2 2 

Należy pamiętać, że zakłada to, że dane zostały posortowane według grup. Ponadto domyślnie max.col jest łamanie więzi (tryby mulitple) losowo. Jeśli chcesz, aby pierwsza lub ostatnia wartość była trybem, możesz ustawić to za pomocą argumentu ties.method.

Powiązane problemy