R:基于其他列中的值移动数据帧中的一列的总和

时间:2015-12-10 20:31:52

标签: r sum

我想计算一列的移动总和(填充为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)}

感谢您的帮助。如果有任何我需要澄清的话,请告诉我。

2 个答案:

答案 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