检查值是否在绝对间隔内

时间:2016-02-09 10:47:45

标签: r

我有一个带数值的data.frame。

dat <- data.frame(time = c(421.95,362.91,327.98,253.98,254.28,253.97,253.98,3.22,0))

我想检查哪些值在某个时间间隔内。例如:如果该间隔的绝对范围是3,则预期输出为:

dat <- data.frame(time = c(421.95,362.91,327.98,253.98,254.28,253.97,253.98,3.22,0), Output = c(0,0,0,1,1,1,1,0,0))

我尝试使用dplyr

dat %>% group_by(time %in% seq(252,255,0.01))

但我必须指定范围[252,255],这是我在数据中无法做到的。是否有矢量化解决方案来标记给定间隔内的所有值?

修改

我写了一个快速(和有缺陷的)循环,希望有助于解释问题:

dat$New <- "NA"
for (i in 1:(nrow(dat)-1)) {
ifelse((dat[i,1] - dat[i+1,1]) > -2 & (dat[i,1] - dat[i+1,1]) < 2,dat[i,2] <- "1",dat[i,2] <- "0")
}

我需要将所有连续值与另一个值进行比较,并检查它们是否符合范围标准。

2 个答案:

答案 0 :(得分:1)

有很多方法可以获得结果。我们可以在逻辑索引上用+换行以转换为二进制,或者使用as.integer/as.numeric或向其添加0,或者在between中都有dplyr/data.table等方便的函数获取逻辑索引(以后可以转换为二进制)。

 dat$output <- with(dat, +(time > 252 & time < 255))
 dat$output
 #[1] 0 0 0 1 1 1 1 0 0

或使用data.table

library(data.table)
as.integer(dat$time %between% c(252, 255))

或者

(dat$time %between% c(252, 255))+0L

或者

ifelse(dat$time %between% c(252, 255), 1, 0)

注意:这个想法首先发布在这里......

更新

如果我们比较相邻元素并检查绝对差值是否小于2,那么

c(FALSE, abs(diff(dat$time)) < 2)

答案 1 :(得分:0)

在基础R中有几种方法可以实现这一点:

div

或:

 dat$output <- (dat$time > 252 & dat$time < 255)*1

或:

 dat$output <- (dat$time > 252 & dat$time < 255) + 0L

或:

 dat$output <- as.integer(dat$time > 252 & dat$time < 255)

所有变体都会导致:

transform(dat, output = (time > 252 & time < 255)*1)