如何在R中按范围合并两个数据帧?

时间:2018-11-29 14:42:11

标签: r

假设我有两个数据帧,例如:

set.seed(123)
df0<-data.frame(pos=3:12, 
                count0=rbinom(10, 50, 0.5),
                count2=rbinom(10, 20, 0.5))
df0
   pos count0 count2
1    3     23     14
2    4     28     10
3    5     24     11
4    6     29     10
5    7     30      7
6    8     19     13
7    9     25      8
8   10     29      6
9   11     25      9
10  12     25     14

df1<-data.frame(start=c(4, 7, 11, 14), 
                 end=c(6, 9, 12, 15), 
                 cnv=c(1, 2, 3, 4))
df1
  start end cnv
1     4   6   1
2     7   9   2
3    11  12   3
4    14  15   4

我想要的是使用df0$pos和范围为df1$startdf1$end的{​​{1}}合并df0和df1。如果pos落在start:end的范围内,则从cnv填充df1,否则将cnv设置为零。上面示例的输出为:

   pos count0 count2 cnv
1    3     23     14   0
2    4     28     10   1
3    5     24     11   1
4    6     29     10   1
5    7     30      7   2
6    8     19     13   2
7    9     25      8   2
8   10     29      6   0
9   11     25      9   3
10  12     25     14   3

1 个答案:

答案 0 :(得分:2)

我们可以使用sapply查找if,其中存在一个索引,该索引在范围else中返回0。

df0$cnv <- sapply(df0$pos, function(x) {
    inds <- x >= df1$start  & x <= df1$end
    if (any(inds))
      df1$cnv[inds]
    else 0
})


df0
#   pos count0 count2 cnv
#1    3     23     14   0
#2    4     28     10   1
#3    5     24     11   1
#4    6     29     10   1
#5    7     30      7   2
#6    8     19     13   2
#7    9     25      8   2
#8   10     29      6   0
#9   11     25      9   3
#10  12     25     14   3