2013-08-27 3 views
0

Я пытаюсь выделить уникальные группы элементов в моих данных - уникальные группировки строк, связанных с ключевым столбцом, а не уникальные элементы, что больше всего использует уникальную функцию для. Вопрос берет некоторое тщательное чтение ... поэтому, пожалуйста, будьте любезны, чтобы сначала переварить пример.Найти уникальные «группы предметов» в многомерных данных

Чтобы быть ясным, Я НЕ хочу уникальное подмножество столбца группы, а также не хочу уникальных подмножеств элементов и даже уникальных комбинаций групп и элементов. Я знаю, что они были охвачены в другом месте unique() for more than one variable. То, что я хочу, это уникальные наборы элементов, где наборы задаются группами.

Вот пример

set.seed(1234) 
library(data.table) 
A <- data.table(group = rep(c("A","B","C","D","E","F"),each = 4), 
item = c(1, 2, 4, 3, 5, 2, 3, 6, 10, 12, 1, 2, 1, 2, 4, 3, 6, 3, 
5, 2, 10, 12, 1, 2), c = runif(8)) 
A <- A[-23, ] #so we can have an example of unbalanced groups 
> A 
    group item   c 
1:  A 1 0.15904600 
2:  A 2 0.03999592 
3:  A 4 0.21879954 
4:  A 3 0.81059855 
5:  B 5 0.52569755 
6:  B 2 0.91465817 
7:  B 3 0.83134505 
8:  B 6 0.04577026 
9:  C 10 0.15904600 
10:  C 12 0.03999592 
11:  C 1 0.21879954 
12:  C 2 0.81059855 
13:  D 1 0.52569755 
14:  D 2 0.91465817 
15:  D 4 0.83134505 
16:  D 3 0.04577026 
17:  E 6 0.15904600 
18:  E 3 0.03999592 
19:  E 5 0.21879954 
20:  E 2 0.81059855 
21:  F 10 0.52569755 
22:  F 12 0.91465817 
23:  F 2 0.04577026 

#The unique groups are A:F, and the unique items are 1:6,10,12. 
#The unique sets of items are: # (set1) 1,2,3,4; (set2) 5,2,3,6; 
#(set3) 10,2,1,2; (set4) 10,12,2 

Я хочу, чтобы получить эти уникальные наборы элементов (опять же отметим, что наборы пункт формируются группами). (Третий столбец на этот раз мало значит. Для удовольствия я включаю суммы по каждому «пункту»). Таблица вывода должна выглядеть следующим образом:

group item c 
A 1 0.68474355 #note that groups A and D share this same set of items (set1) 
A 2 0.95465409 
A 4 1.05014459# c sums groupAitem4$c with groupDitem4$c 
A 3 0.85636881 
B 5 0.74449709 # group E has the same items (set2), even if not the same order, c is totaled by item. 
B 2 1.72525672 
B 3 0.87134097 
B 6 0.20481626 
C 10 0.159046 
C 12 0.03999592 
C 1 0.21879954 
C 2 0.81059855 
F 10 0.52569755 #Not the same as group C 
F 12 0.91465817 
F 2 0.04577026 

Я полагаю, что может быть способом идти через перекроить, что было бы весьма неудобно. Мои данные большие, поэтому очень эффективные процедуры, такие как data.table.

+1

Не фантазии/эффективную, но 'strsplit (уникальные (paste0 (A $ группы«»A $ пункта)), ",") ' –

+1

Как вы хотите обрабатывать различные значения' A $ c', которые принадлежат каждому уникальному спариванию? Взгляните на 'aggregate' и' plyr' для общих идей. –

+0

Возможный дубликат [Unique() для нескольких переменных] (http://stackoverflow.com/questions/7790732/unique-for-more-than-one-variable) и http://stackoverflow.com/questions/ 9944816/unique-on-a-dataframe-only-selected-columns? Rq = 1 и http://stackoverflow.com/questions/10873203/r-find-all-unique-values-among-subsets-of- a-data-frame? rq = 1 –

ответ

2
library(plyr) 
my<-ddply(A,.(group),summarize, mylist=list(item)) 

> my 
    group  mylist 
1  A 1, 2, 4, 3 
2  B 5, 2, 3, 6 
3  C 10, 12, 1, 2 
4  D 1, 2, 4, 3 
5  E 6, 3, 5, 2 
6  F 10, 12, 2 

yy<-as.list(1:6) # used for `Map` function 
my$mylist<-Map(function(x) sort(my$mylist[[x]]),yy) # sort the order of elements in list for matching 

> my 
    group  mylist 
1  A 1, 2, 3, 4 
2  B 2, 3, 5, 6 
3  C 1, 2, 10, 12 
4  D 1, 2, 3, 4 
5  E 2, 3, 5, 6 
6  F 2, 10, 12 

myuni<-unique(my$mylist) 

> myuni 
[[1]] 
[1] 1 2 3 4 

[[2]] 
[1] 2 3 5 6 

[[3]] 
[1] 1 2 10 12 

[[4]] 
[1] 2 10 12 

finaloutput<-my[match(myuni,my$mylist),] 
    group  mylist 
1  A 1, 2, 3, 4 
2  B 2, 3, 5, 6 
3  C 1, 2, 10, 12 
6  F 2, 10, 12 

A[A$group %in% finaloutput$group,] 
    group item   c 
1  A 1 0.113703411 
2  A 2 0.622299405 
3  A 4 0.609274733 
4  A 3 0.623379442 
5  B 5 0.860915384 
6  B 2 0.640310605 
7  B 3 0.009495756 
8  B 6 0.232550506 
9  C 10 0.113703411 
10  C 12 0.622299405 
11  C 1 0.609274733 
12  C 2 0.623379442 
21  F 10 0.860915384 
22  F 12 0.640310605 
23  F 2 0.232550506 
+0

Спасибо за попытку, но тот же вопрос, что и предложение Джессики выше. Этот ответ дает 8 строк не 4. Дубликаты наборов элементов включены. – user2627717

+0

Было бы полезно продемонстрировать ваши решения с помощью воспроизводимого кода. – user2627717

+0

Я не уверен, о чем вы просите. Уже есть воспроизводимый код. – Metrics

0

Если вам просто нужно комбинации

unique(dataset[, c("group", "item")]) 
+0

Нет кубиков. Я попытался объяснить в вопросе, что мне нужны все уникальные наборы элементов, наборы элементов определяются группой. Благодарю. – user2627717

+0

Я думаю, вы хотите попросить уникальные двухпозиционные комбинации предметов, а не «уникальные наборы предметов». Понимание людей на математических наборах может мешать коммуникации здесь. –

+0

@ DWin. Я думаю, что пример в вопросе показывает, что я не хочу двухсторонних комбинаций. Я подумал, что некоторые усилия направлены на то, чтобы мой вопрос не смешивался таким образом ... ну ладно. – user2627717

0

Поскольку вы не используете set.seed или dput, каждый пытается использовать ваш код будет получить другой результат. Это может дать вам то, что вы хотите, хотя на данный момент остается неясным, если количество элементов в группах всегда будет маленьким и является ли это только 2way комбинации, которые желательны:

unique(t(do.call(cbind, tapply(A$item, A$group, combn, 2))) ) 

combn функция возвращает уникальные комбинации в формате столбца, поэтому мне нужно было транспонировать до использования unique, который работает по строкам по умолчанию. Если бы вы могли работать с ориентированным результатом колонки, вы можете пропустить этот шаг, если вы используете MARGIN аргумент:

unique(do.call(cbind, tapply(A$item, A$group, combn, 2)) , MARGIN=2) 
+0

Если вы ожидаете соответствия вашему результату, вам просто нужно использовать 'A [уникальный (A $ item),]'. См. Мой ответ – Metrics

+0

@Метрики: см. Мой ответ на ваш ответ. – user2627717

+0

@Metrics: Надеюсь, что этот пример помогает объяснить, что я хочу. Я понимаю, что этот вопрос сложный. – user2627717

Смежные вопросы