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

时间:2017-06-07 13:16:51

标签: r group-by dplyr overlap

我有按样本分组的观察列表。我想找到共享最相同观察结果的样本。相同的观察结果是两个样本之间的起始和结束编号都匹配。如果可能的话,我想使用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

提前致谢

2 个答案:

答案 0 :(得分:1)

这里有一些可以帮助你的事情:

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

答案 1 :(得分:1)

这是基于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