Фильтровать R-фрейм данных другим фреймом, используя допуск? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть два кадра данных (A & B) разной длины. Для заданного значения в A я хочу знать, есть ли где-нибудь значения в B, которые находятся в пределах допуска +/- 0,3. Также было бы полезно узнать положение этого значения в B.

A<-c(1:10)
B<-c(2.2,15,1.8,4.9,20,14,8.2,33,9.8,41,16)

, т. Е. Для A [1] нет значения в B в пределах допуска,

, но для A [ 2], значения в B [1] и B [3] находятся в пределах допуска и т. Д.

Я экспериментировал с функцией near в dplyr, однако мне кажется, что я могу сравнивать ее только построчно. Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

Мы можем использовать between

library(purrr)
map(A, ~  B[between(B, .x - 0.3, .x + 0.3)]) %>% 
     flatten_dbl
1 голос
/ 08 апреля 2020

Вот одна идея. result это список. Если совпадений нет, длина элемента в result равна 0. В противном случае result документирует индекс в B, который соответствует требованию.

A <- 1:10
B <- c(2.2,15,1.8,4.9,20,14,8.2,33,9.8,41,16)

difference <- list()

for (i in 1:length(A)){
  difference[[i]] <- B - A[i]
}

result <- lapply(difference, function(x) which(x < 0.3 & x > -0.3))
0 голосов
/ 08 апреля 2020

В базе R мы можем использовать sapply:

unlist(sapply(A, function(x) B[B >= (x- 0.3) & B <= (x + 0.3)]))
#[1] 2.2 1.8 4.9 8.2 9.8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...