【问题标题】:Find unique 'item groups' in multivariate data在多元数据中查找唯一的“项目组”
【发布时间】:2013-08-30 05:42:55
【问题描述】:

我正在尝试隔离我的数据中唯一的项目组 - 与键列相关联的唯一行分组,而不是唯一项目,这是大多数使用唯一功能的原因。这个问题需要仔细阅读......所以请先消化这个例子。

明确地说,我不想要组列的唯一子集,也不想要项的唯一子集,甚至组和项的唯一组合。我知道这些已经在其他地方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 这样的高效程序。

【问题讨论】:

  • 不花哨/高效,但strsplit(unique(paste0(A$group,",",A$item)),",")
  • 您想如何处理属于每个唯一配对的各种A$c 值?查看aggregateplyr 了解一般想法。
  • @CarlWitthoft:我可以保留 A$c 列的第一个,但这是我最不担心的。
  • @JessicaB:您建议的 strsplit... 代码似乎不起作用。它给了我所有的 A 行,重复的和所有的。请注意,我要保留的是项目的独特组合。

标签: r grouping unique


【解决方案1】:
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

【讨论】:

  • 感谢您的尝试,但与上述 Jessica 的建议相同。这个答案给出了 8 行而不是 4 行。包括重复项集。
  • 用可重现的代码演示您的解决方案会很有帮助。
  • 我不确定您要什么。已经有可复现的代码了。
  • 请您将可重现代码的输出与我想要的输出进行比较,正如问题中明确描述的那样。你会看到它们不匹配。感谢您提供帮助。
  • 并非如此。我解释说我不想要独特的物品集。如果您可以放纵我并尝试以下示例:A
【解决方案2】:

如果你只是需要组合

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

【讨论】:

  • 没有骰子。我试图在问题中解释我想要所有唯一的项目集,项目集是按组定义的。谢谢。
  • 我认为您的意思是要求项目的独特 2 路组合,而不是“唯一的项目集”。人们对数学集的理解可能会妨碍这里的交流。
  • @DWin。我认为问题中的示例表明我不想要 2 路组合。我认为我付出了一些努力来确保我的问题不会以这种方式混淆......哦,好吧。
【解决方案3】:

由于您不使用 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)

【讨论】:

  • 如果您希望与您的输出匹配,您只需要使用A[unique(A$item),]。看我的回答
  • @Metrics:请看我对你的回答的回复。
  • @Metrics:我希望这个例子有助于解释我想要什么。我知道这个问题很棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多