lukeg
lukeg

Reputation: 1357

extracting data using dplyr

Say I have the following data

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

Now I want to extract data whereby:

For each unique value of a, extract/match data where the b value is the same and the c value is within a limit of +-5

so a desired output should produce:

enter image description here

Upvotes: 0

Views: 136

Answers (1)

David Arenburg
David Arenburg

Reputation: 92302

You want to compare within each distinct b group (as they are unique within each a), thus you should group by b. It is also not possible to group by a and compare between them, thus a possible solution would be

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

with data.table package this would be something like

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

Or

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

Or

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

In base R it would be something like

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

Upvotes: 6

Related Questions