当速度为0时,将其保持为零的时间(r)加起来

  • 本文关键字:时间 起来 0时 速度 r
  • 更新时间 :
  • 英文 :


这是我第一次来这里。我自己已经设法完成了大部分代码,但我卡在最后一部分。

从设备读取数据后,我创建了下面的标题。它根据从设备收集的时间和距离计算速度,计算滚动平均值,然后通过将任何低于0的阈值设置为0来清除它

我试着总结清理速度为0的持续时间。这样我就可以从最后的时间中减去它,得到轮子转动的时间。

提前感谢您的帮助!

time distance slope `rolling velocity avg` `clean velocity`
<dbl>    <dbl> <dbl>                  <dbl>            <dbl>
1  2.51     0    0                     0.164             0    
2  3.55     0    0.168                 0.327             0.327
3  4.56     0.17 0.486                 0.450             0.450
4  5.61     0.68 0.654                 0.567             0.567
5  6.65     1.36 0.490                 0.527             0.527
6  7.69     1.87 0.638                 0.364             0.364
7  8.74     2.54 0.327                 0.241             0.241
8  9.78     2.88 0                     0.0817            0    
9 10.8      2.88 0                     0                 0    
10 11.9      2.88 0                     0.0810            0    
11 12.9      2.88 0                     0.285             0.285
12 14.0      2.88 0.324                 0.449             0.449
13 15        3.22 0.817                 0.651             0.651
14 16.0      4.07 0.654                 0.731             0.731
15 17.1      4.75 0.810                 0.649             0.649

编辑:我将添加标题为"句号停止"的第六列。该列将包含从零开始到变为非零值所经过的时间。把它放在停止周期的末尾是有意义的。例如,第8行到第10行没有速度,因此它将减去[10,1]-[8,1]并输出在[10,6]处经过的时间。任何时候出现一个新的零序列,它都会做同样的事情,直到它到达标题

的末尾。

这是你要找的吗?

library(data.table)
library(dplyr)
df %>%
mutate(lead = lead(time)) %>%
group_by(grp = rleid(`clean velocity`)) %>%
mutate(StopDuration = (`clean velocity` == 0) * (row_number() == 1) * (max(lead) - time)) %>%
ungroup() %>%
select(-grp, -lead)

给出以下表格:

# A tibble: 15 x 6
time distance slope `rolling velocity avg` `clean velocity` StopDuration
<dbl>    <dbl> <dbl>                  <dbl>            <dbl>        <dbl>
1  2.51     0    0                     0.164             0             1.04
2  3.55     0    0.168                 0.327             0.327         0   
3  4.56     0.17 0.486                 0.45              0.45          0   
4  5.61     0.68 0.654                 0.567             0.567         0   
5  6.65     1.36 0.49                  0.527             0.527         0   
6  7.69     1.87 0.638                 0.364             0.364         0   
7  8.74     2.54 0.327                 0.241             0.241         0   
8  9.78     2.88 0                     0.0817            0             3.12
9 10.8      2.88 0                     0                 0             0   
10 11.9      2.88 0                     0.081             0             0   
11 12.9      2.88 0                     0.285             0.285         0   
12 14        2.88 0.324                 0.449             0.449         0   
13 15        3.22 0.817                 0.651             0.651         0   
14 16        4.07 0.654                 0.731             0.731         0   
15 17.1      4.75 0.81                  0.649             0.649        NA  

假设输入在最后的注释中可重复显示。

在评论中,问题的发布者指出,对于每个连续的零组,新列的最后一个元素应该是第一次和最后一次的差值,即该组中最大和最小时间的差值。其他值没有定义,但我们假设任何未定义的组件都应该为0。rleidfrom data。表用于给每组连续元素一个唯一的id(或者使用崩溃包中的groupid),我们乘以clean_velocity==0将不对应于0的任何元素归零。

library(data.table) # rleid
DF[10,1] - DF[8,1] # check: expected value in position 10,6 of result
## [1] 2.12
FUN <- function(x) c(rep(0, length(x)-1), diff(range(x)))
transform(DF, stopped = 
(clean_velocity == 0) * (ave(time, rleid(clean_velocity), FUN = FUN)))
time distance slope rolling_velocity_avg clean_velocity stopped
1   2.51     0.00 0.000               0.1640          0.000    0.00
2   3.55     0.00 0.168               0.3270          0.327    0.00
3   4.56     0.17 0.486               0.4500          0.450    0.00
4   5.61     0.68 0.654               0.5670          0.567    0.00
5   6.65     1.36 0.490               0.5270          0.527    0.00
6   7.69     1.87 0.638               0.3640          0.364    0.00
7   8.74     2.54 0.327               0.2410          0.241    0.00
8   9.78     2.88 0.000               0.0817          0.000    0.00
9  10.80     2.88 0.000               0.0000          0.000    0.00
10 11.90     2.88 0.000               0.0810          0.000    2.12
11 12.90     2.88 0.000               0.2850          0.285    0.00
12 14.00     2.88 0.324               0.4490          0.449    0.00
13 15.00     3.22 0.817               0.6510          0.651    0.00
14 16.00     4.07 0.654               0.7310          0.731    0.00
15 17.10     4.75 0.810               0.6490          0.649    0.00

或者,这可以用dlyr表示,其中FUN来自上面。

library(data.table)
library(dplyr)
DF %>%
group_by(g = rleid(clean_velocity)) %>%
mutate(stopped = (clean_velocity == 0) * FUN(time)) %>%
ungroup %>%
select(-g)

注意

DF <-
structure(list(time = c(2.51, 3.55, 4.56, 5.61, 6.65, 7.69, 8.74, 
9.78, 10.8, 11.9, 12.9, 14, 15, 16, 17.1), distance = c(0, 0, 
0.17, 0.68, 1.36, 1.87, 2.54, 2.88, 2.88, 2.88, 2.88, 2.88, 3.22, 
4.07, 4.75), slope = c(0, 0.168, 0.486, 0.654, 0.49, 0.638, 0.327, 
0, 0, 0, 0, 0.324, 0.817, 0.654, 0.81), rolling_velocity_avg = c(0.164, 
0.327, 0.45, 0.567, 0.527, 0.364, 0.241, 0.0817, 0, 0.081, 0.285, 
0.449, 0.651, 0.731, 0.649), clean_velocity = c(0, 0.327, 0.45, 
0.567, 0.527, 0.364, 0.241, 0, 0, 0, 0.285, 0.449, 0.651, 0.731, 
0.649)), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"))

如果我理解正确的话,这就是我的建议。

步骤1:创建一个新列,计算每个连续行之间的时间差(假设它们被正确排序):

library(dplyr)
df %>%
mutate(t_lead = lead(time)-time)
time distance slope rolling_velocity_avg clean_velocity t_lead
1   2.51     0.00 0.000               0.1640          0.000   1.04
2   3.55     0.00 0.168               0.3270          0.327   1.01
3   4.56     0.17 0.486               0.4500          0.450   1.05
4   5.61     0.68 0.654               0.5670          0.567   1.04
5   6.65     1.36 0.490               0.5270          0.527   1.04
6   7.69     1.87 0.638               0.3640          0.364   1.05
7   8.74     2.54 0.327               0.2410          0.241   1.04
8   9.78     2.88 0.000               0.0817          0.000   1.02
9  10.80     2.88 0.000               0.0000          0.000   1.10
10 11.90     2.88 0.000               0.0810          0.000   1.00
11 12.90     2.88 0.000               0.2850          0.285   1.10
12 14.00     2.88 0.324               0.4490          0.449   1.00
13 15.00     3.22 0.817               0.6510          0.651   1.00
14 16.00     4.07 0.654               0.7310          0.731   1.10
15 17.10     4.75 0.810               0.6490          0.649     NA

步骤2:过滤clean_velocity == 0并总结t_lead:

df %>%
mutate(t_lead = lead(time)-time) %>%
filter(clean_velocity == 0) %>%
summarize(sum_time = sum(t_lead))
sum_time
1     4.16

相关内容

最新更新