我有一个带数值的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")
}
我需要将所有连续值与另一个值进行比较,并检查它们是否符合范围标准。
答案 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)