繁体   English   中英

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

[英]How to merge two data frames by ranges in 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$posdf1$startdf1$end的范围合并df0和df1。 如果pos落在start:end范围内,则从df1填充cnv ,否则将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

我们可以用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM