问题描述
我想创建一个相互重叠的 ID 小众网络。
df <-
data.frame(
id = 1:5,start_year = c(2010,2010,2011,2013,2014),end_year = c(2014,2012,2018,2015,2020))
id start_year end_year
1 1 2010 2014
2 2 2010 2012
3 3 2011 2018
4 4 2013 2015
5 5 2014 2020
需要成对比较,这是我想不通的部分。对于任何 x y 比较,它看起来像这样:
1 & 2 overlapped 3 years (2010,2012)
1 & 3 overlapped 4 years (2011,2014)
1 & 4 overlapped 2 years (2013,2014)
etc
对于上述 3 个示例,我所关心的只是让它一式三份:
1,2,3
1,3,4
1,4,2
etc
TIA
解决方法
可以利用combn得到不同的行组合并应用得到重叠
result <- as.data.frame(t(apply(combn(nrow(df),2),2,function(x) c(id_1 = x[1],id_2 = x[2],overlap = sum(df[x[1],2]:df[x[1],3] %in% df[x[2],2]:df[x[2],3])))))
result
id_1 id_2 overlap
1 1 2 3
2 1 3 4
3 1 4 2
4 1 5 1
5 2 3 2
6 2 4 0
7 2 5 0
8 3 4 3
9 3 5 5
10 4 5 2