2015-01-23 4 views
0

Скажем, у меня есть следующие данныеизвлечение данных с использованием dplyr

set.seed(123) 

a <- c(rep(1,30),rep(2,30)) 
b <- rep(1:30) 
c <- sample(20:60, 60, replace = T) 
data <- data.frame(a,b,c) 
data 

Теперь я хочу, чтобы извлечь данные при этом:

Для каждого уникального значения a, извлекать данные/матч, где значение b является тем же самым и значение c находится в пределе + -5

поэтому требуемый выход должен производить:

enter image description here

+0

Я думаю, что вам не хватает здесь слово –

+0

я не уверен, что будет нужный из пут, но вы ищете 'данных%> % group_by (a)%>% фильтр (abs (b - c) <= 5) '? –

+0

, так что здесь a равно 1 или 2. Если a = 1, оцените все случаи, когда a = 2, и извлеките так, чтобы значение b было одинаковым, а значение c находилось в пределах + -5. – lukeg

ответ

6

Вы хотите сравнить в каждый отчетливое b группы (так как они являются уникальными в пределах каждого a), таким образом, вы должны группировать по b. Также не представляется возможным группе a и сравнить между их, таким образом, возможным решением было бы

data %>% 
    group_by(b) %>% 
    filter(abs(diff(c)) <= 5) 

с data.table пакетом это будет что-то вроде

library(data.table) 
setDT(data)[, .SD[abs(diff(c)) <= 5], b] 

Или

data[, if (abs(diff(c)) <= 5) .SD, b] 

или

data[data[, abs(diff(c)) <= 5, b]$V1] 

В базовой R было бы что-то вроде

data[with(data, !!ave(c, b, FUN = function(x) abs(diff(x)) <= 5)), ]