使用 dplyr 计算样本之间共享观察的数量

Count number of shared observations between samples using dplyr

我有一个按样本分组的观察列表。我想找到具有最相同观察结果的样本。相同的观察结果是两个样本之间的开始和结束编号都匹配。如果可能的话,我想使用 R 并且最好使用 dplyr 来执行此操作。 我已经习惯使用 dplyr 来进行更简单的数据处理,但这项任务超出了我目前的能力范围。我一直在想解决方案涉及将开始和结束分组到一个变量中:group_by(start,end) 但我还需要保留有关每个观察属于哪个样本的信息并在样本之间进行比较。

示例:

sample  start   end
a   2   4
a   3   6
a   4   8
b   2   4
b   3   6
b   10  12
c   10  12
c   0   4
c   2   4

此处样本 a、b 和 c 共享 1 个观察值 (2, 4) 样本 a 和 b 共享 2 个观察值 (2 4, 3 6) 样本 b 和 c 共享 2 个观察值 (2 4, 10 12) 样本 a 和 c 共享 1 个观察值 (2 4)

我想要这样的输出:

abc 1
ab 2
bc 2
ac 1 

并在可能的情况下查看共享观察结果:

abc 2 4
ab 2 4 
ab 3 6

提前致谢

这里有一些可以让你继续前进的东西:

df %>% 
  group_by(start, end) %>% 
  summarise(
    samples = paste(unique(sample), collapse = ""), 
    n = length(unique(sample)))

# Source: local data frame [5 x 4]
# Groups: start [?]
# 
#   start   end samples     n
#   <int> <int>   <chr> <int>
# 1     0     4       c     1
# 2     2     4     abc     3
# 3     3     6      ab     2
# 4     4     8       a     1
# 5    10    12      bc     2

这是一个基于 base R 的想法,

final_d <- data.frame(count1 = sapply(Filter(nrow, split(df, list(df$start, df$end))), nrow), 
                      pairs1 = sapply(Filter(nrow, split(df, list(df$start, df$end))), function(i) paste(i[[1]], collapse = '')))

#      count1 pairs1
#0.4        1      c
#2.4        3    abc
#3.6        2     ab
#4.8        1      a
#10.12      2     bc