2013-08-27 25 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 

我想找回物品的这些独特的套(再次指出,该项目组由形成)。 (第三列目前意思不大,为了好玩,我在每个'item'中加入了和数)。 输出表应该是这样的:

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()for multiple variable)可能的重复(http://stackoverflow.com/questions/7790732/unique-for-more-than-one-variable)和http://stackoverflow.com/questions/ 9944816/unique-on-a-dataframe-with-only-selected-columns?rq = 1 and 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,每个人都试图用你的代码会得到不同的结果。这可能给你想要的东西,虽然目前还不清楚,如果项目在一个组的数量将永远是小,无论是只有那些期望的2路组合:

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 [unique(A $ item)]''。查看我的回答 – Metrics

+0

@Metrics:请查看我对您答案的回复。 – user2627717

+0

@Metrics:我希望这个例子有助于解释我想要的。我明白这个问题很棘手。 – user2627717

相关问题