首页 > 解决方案 > 如何在给定对列表的情况下获取集合的大小?

问题描述

假设我运行了不同的测试来查看某些对象是否相同。测试是成对完成的,我有一个包含相同对象对的数据框:

same.pairs <- data.frame(Test=c(rep(1, 4), rep(2, 6)),
                         First=c("A", "A", "B", "D", "A", "A", "B", "C", "C", "D"), 
                         Second=c("B", "C", "C", "E", "B", "E", "E", "D", "G", "G"))

##

Test First Second
   1     A      B
   1     A      C
   1     B      C
   1     D      E
   2     A      B
   2     A      E
   2     B      E
   2     C      D
   2     C      G
   2     D      G

从这里我可以看到,在测试 1 中,因为 A = B 和 A = C 和 B = C,那么 A = B = C 并且这 3 个对象属于一组大小为 3 的对象。

我想知道每个测试集的完整大小。对于这个例子,我想知道对于测试 1,一组是 3 个相同的对象(A,B,C),一组是 2(D,E),对于测试 2,两组是大小 3((A , B, E) 和 (C, D, G))。我不需要知道每个集合中有哪些对象,只需要知道集合的大小以及该大小的集合的计数

Test ReplicateSize Count
   1             3     1
   1             2     1
   2             3     2

有没有一种优雅的方式来做到这一点?我以为我有这个:

sets <-  same.pairs %>%
  group_by(Test, First) %>%
  summarize(ReplicateSize=n()) %>%
  # add 1 to size because above only counting second genotype, need to include first
  mutate(ReplicateSize=ReplicateSize+1) %>%
  select(-First) %>%
  ungroup() %>%
  group_by(Test, ReplicateSize) %>%
  summarize(Count=n()) %>%
  arrange(Test, ReplicateSize)

##

Test ReplicateSize Count
   1             2     2
   1             3     1
   2             2     2
   2             3     2

但这会重复计算某些集合,例如在测试 1 中,B&C 被计为大小为 2 的集合,而不是被忽略,因为它们已经是 A 集合的一部分。我不确定如何跳过其中的行第一个对象已被观察为第二个对象,而无需进行复杂的 for 循环。

任何指导表示赞赏。

标签: r

解决方案


我不完全理解您要完成的工作,但您当前的代码可能会被截断为以下内容:

same.pairs %>%
  count(Test, First, name = "ReplicateSize") %>% 
  count(Test, ReplicateSize, name = "Count") %>% 
  mutate(ReplicateSize = ReplicateSize + 1)

  Test ReplicateSize Count
1    1             2     2
2    1             3     1
3    2             2     2
4    2             3     2

推荐阅读