2016-09-28 22 views
6

Mam tabeli z dwoma kolumnami mianowicie id i item:Znajdź najczęstszych kompletacji w ramach Vector przez Grupę

df <- data.frame(id=c(1,1,2,2,2,2,3,3,3,4,4,4,4,4),item=c(1,2,3,1,2,3,4,1,2,3,1,2,1,2)) 

Chcę znaleźć najczęstszą kombinacji (kolejność nie ma znaczenia) z 3 sztuk na id. Zasadniczo, n wybierz r, gdzie n = number of items within id i r = 3. Liczba pozycji na id jest różna - niektóre mają więcej niż 3, a niektóre mniej.

Jestem nowy dla R i czytać o combn i expand.grid, ale nie wiem jak z nich korzystać w moim przypadku (do pracy w obrębie każdego id).

"Find most frequent combination of values in a data.frame" to najbliższe pytanie, które znalazłem.

Edycja: Oczekiwana odpowiedź na przykładzie jest kombinacja "1, 2, 3", która pojawia się w ID 2 i 4.

+3

Proszę dodać oczekiwany wynik na podstawie danych przykładowych t o Twoje pytanie –

+0

Czy n nie wybierze r? zwróci numer? Możesz znaleźć liczbę przedmiotów na "id" używając odpowiedzi @Stephen za pomocą 'group_by (id)'. Czy chcesz rozważyć wszystkie permutacje 3 liczb i wyświetlić najczęstsze z opcji 'n choose r'? – paulwasit

Odpowiedz

2

Oto jeden pomysł z wykorzystaniem dplyr

df1 <- df %>% 
     group_by(id) %>% 
     arrange(item) %>% 
     summarise(new = paste(unique(combn(item, length(unique(item)), toString)), collapse = '/')) 
df1 
# A tibble: 4 × 2 
#  id            new 
# <dbl>           <chr> 
#1  1           1, 2 
#2  2      1, 2, 3/1, 3, 3/2, 3, 3 
#3  3           1, 2, 4 
#4  4 1, 1, 2/1, 1, 3/1, 2, 2/1, 2, 3/2, 2, 3 

names(sort(table(unlist(strsplit(df1$new, '/'))), decreasing = TRUE)[1]) 
#[1] "1, 2, 3" 
+0

Wielkie dzięki. To świetne rozwiązanie. Muszę czegoś pomijać, ponieważ otrzymuję dokładnie to samo 'df1', ale kiedy uruchomię ostatni bit' nazwy (... ', otrzymuję aktualizację' [1] "1, 1, 3" ' – DGenchev

+0

. ... – Sotos

0
library(dplyr) 
grouped <- df %>% group_by(id,item) %>% summarize(count = n()) %>% arrange(desc(count)) 

Voila. Najwyższe liczby posortowane od najwyższego do najniższego.

EDYCJA: Właśnie zdałem sobie sprawę, że nie w pełni odpowiedziałem na twoje pytanie. Mam nadzieję, że dobrze ci się powiodło.

+0

Dzięki za szybką odpowiedź. Właśnie dodałem oczekiwany wynik zgodnie z prośbą. Szukam najczęstszej kombinacji przedmiotów, a nie najczęstszego przedmiotu. – DGenchev

0

myślę, że to, co chcesz za pomocą zasady R (bez opakowania potrzebne):

a <- aggregate(item~id, df, unique) 
a <- lapply(a$item, 'length<-', max(lengths(a$item))) 
m <- matrix(unlist(a), ncol=3, byrow = T) 
m <- t(apply(m,1,function(x) sort(x,na.last = T))) 

#  [,1] [,2] [,3] 
#[1,] 1 2 NA 
#[2,] 1 2 3 
#[3,] 1 2 4 
#[4,] 1 2 3 

Gdy otrzymujemy macierz m, najczęstszą wiersz matrycy jest to, co chcesz:

t <- table(apply(m, 1, paste, collapse = "/")) 
as.numeric(strsplit(names(which.max(t)), "/")[[1]]) 

#[1] 1 2 3 
+0

Dziękuję za odpowiedź, ale nie widzę, jak agregat zajmuje się różnymi kombinacjami możliwymi w obrębie identyfikatora. Wydaje się, że zajmuje tylko pierwsze 3 elementy w każdym z nich. – DGenchev

+0

@DGenchev zaktualizował mój wpis. dla unikalnych elementów na 'id', kolejność, którą widzisz jest przypadkiem i jeśli zmienisz kolejność w oryginalnym' df', zobaczysz, że działa zgodnie z oczekiwaniami – 989

+0

OK, myślę, że dostaję to teraz. jeśli jedna grupa ma więcej pozycji niż wszystkie inne (tj. wszystkie inne grupy będą miały NA, a na wierzchu znajdzie się więcej elementów) Testowałem ją dodając jeszcze jeden rekord z 'id = 4' i' item = 5' – DGenchev