Как объединить два кадра данных по диапазонам в R? - PullRequest
0 голосов
/ 29 ноября 2018

Предположим, у меня есть два фрейма данных, например:

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 и df1, используя df0$pos с диапазонами df1$start и df1$end.Если 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 голосов
/ 29 ноября 2018

Мы можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...