我想计算一列的移动总和(填充为1和0),但仅当相应列(时间)中的值在(移动)值范围内时才会计算。
我的数据如下:
values <- c(1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0)
seconds <- c(0.0, 1.0, 2.5, 3.0, 5.5, 6.0, 6.5, 7.0, 8.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.5, 16.0, 17.0, 18.0, 19.0, 20.0)
data <- data.frame(values, seconds)
假设我想在'values'列中总计每5秒钟的数据。 然后我的第一个5秒总和(秒> = 0&amp;秒&lt; = 5)将是:
1(因为它对应于'秒',0.0,在感兴趣的区间内)
+
0(对应于'秒'中的1.0)
+
0(2.5)
+
0(3.0)
= 1
停止,因为下一个值(1)对应于5.5秒,超出了间隔。
接下来的5秒间隔(秒> = 1&amp;秒&lt; = 6)将等于:
0 + 0 + 0 + 1 + 1 = 2
第3个间隔:
(秒> = 2.5&amp;秒&lt; = 7.5)= 0 + 0 + 1 + 1 + 0 + 1 = 3
等等。
我是一个R菜鸟,所以这是我用来计算它的方法(它超级慢,所以我知道必须有更好的方法):
for(i in 1:20){movsum[i] <- sum(subset(data, seconds >= (seconds[i] - 5.0) & seconds <= seconds[i])$values)}
感谢您的帮助。如果有任何我需要澄清的话,请告诉我。
答案 0 :(得分:3)
这是一个可能的data.table::foverlaps
解决方案。这里的想法是创建5秒间隔查找表,然后在data
内查找每个间隔中的值。
选择间隔
int <- 5 ## 5 seconds
加载包,向data
添加其他(相同)列以设置边界,创建一个新行数据集,每行具有所需的边界,运行foverlaps
,键{{ 1}}为了启用二进制连接,找到data
中的相应值并按每个间隔求和,类似下面的内容似乎可以工作
data$values
答案 1 :(得分:3)
您可以尝试使用zoo
包中的某些功能:
library(zoo)
# convert your data to a zoo time series
z <- read.zoo(data, index = "seconds")
# create an empty, regular time series,
# which contains the full time range, in steps of 0.5 sec
z0 <- zoo(, seq(from = start(z), to = end(z), by = 0.5))
# 'expand' the irregular, original data to a regular series, by merging it with z0
z2 <- merge(z, z0)
# apply the desired function (sum) to a rolling window of width 11
# (number of observations in each window)
# move the time frame in steps of 2 (by = 2) which correspond to 1 sec
# use partial = TRUE, to allow the window to pass outside the time range
rollapply(z2, width = 11, by = 2, FUN = sum, na.rm = TRUE,
align = "left", partial = TRUE)
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 1 2 3 3 3 3 2 2 1 2 2 3 3 2 2 1 0 0 0 0 0