在R中有条件地计算特定数据范围的平均速度

Posted

技术标签:

【中文标题】在R中有条件地计算特定数据范围的平均速度【英文标题】:in R calculate mean speed of specific data range conditionally 【发布时间】:2021-06-12 00:01:09 【问题描述】:

我需要计算按属性type分组的平均步行速度。但前提是观察按时间顺序排列。因此,如果类型不是行程,则下一个行程“集群”具有另一种含义。

这是一个数据样本:

1   Time    speedms     type        
1   1:12:21 1.0978790   trip    
2   1:12:22 1.5707432   trip    
3   1:12:23 1.0745824   
4   1:12:24 1.1682027   
5   1:12:25 1.3859502   
6   1:12:26 0.9657960   trip    
7   1:12:27 1.2591893   trip    
8   1:12:28 2.0004471   trip    
9   1:12:29 2.2239989   
10  1:12:30 1.6928664   
11  1:12:31 2.8167094   trip    
12  1:12:32 3.7848781   trip    
13  1:12:33 0.4496923   

这就是我想要的结构。一个新列(平均值),其中包含该集群中每个观测值的每个集群的平均值。

1   Time    speedms     type        MEAN
1   1:12:21 1.0978790   trip    1.334311
2   1:12:22 1.5707432   trip    1.334311
3   1:12:23 1.0745824   
4   1:12:24 1.1682027   
5   1:12:25 1.3859502   
6   1:12:26 0.9657960   trip    1.408477
7   1:12:27 1.2591893   trip    1.408477
8   1:12:28 2.0004471   trip    1.408477
9   1:12:29 2.2239989   
10  1:12:30 1.6928664   
11  1:12:31 2.8167094   trip    3.300793
12  1:12:32 3.7848781   trip    3.300793
13  1:12:33 0.4496923   

感谢您的帮助

【问题讨论】:

第二次出行,MEAN = 1.074582怎么算? 嗨 waldi,MEAN 现在是正确的。 “平均”列是我想要的新列。我将其分成表格(样本数据和所需数据)。 目前我尝试编写一个for循环并检查类型i的值和类型i + 1的值是否相同。如果是这样,我将在新列中写一个 ID。只要比较为 TRUE,ID 总是相同的。但是我有超过 170 次 mio 观察...这绝对不是时间效率...之后我可以使用 ifelse 语句(通过 ID 和 TYPE)计算平均值。 【参考方案1】:

您可以使用data.table 中的rleid

library(data.table)
data <- read.table(text=
"Time    speedms     type   
1:12:21 1.0978790   'trip'  
1:12:22 1.5707432   'trip'  
1:12:23 1.0745824   NA
1:12:24 1.1682027   NA
1:12:25 1.3859502   NA
1:12:26 0.9657960   'trip'  
1:12:27 1.2591893   'trip'  
1:12:28 2.0004471   'trip'  
1:12:29 2.2239989   NA
1:12:30 1.6928664   NA
1:12:31 2.8167094   'trip'  
1:12:32 3.7848781   'trip'  
1:12:33 0.4496923   NA",header=T) 


setDT(data)

data[,MEAN:=fifelse(type=='trip',mean(speedms), NA_real_), by = rleid(type)]
data
#>        Time   speedms type     MEAN
#>  1: 1:12:21 1.0978790 trip 1.334311
#>  2: 1:12:22 1.5707432 trip 1.334311
#>  3: 1:12:23 1.0745824 <NA>       NA
#>  4: 1:12:24 1.1682027 <NA>       NA
#>  5: 1:12:25 1.3859502 <NA>       NA
#>  6: 1:12:26 0.9657960 trip 1.408477
#>  7: 1:12:27 1.2591893 trip 1.408477
#>  8: 1:12:28 2.0004471 trip 1.408477
#>  9: 1:12:29 2.2239989 <NA>       NA
#> 10: 1:12:30 1.6928664 <NA>       NA
#> 11: 1:12:31 2.8167094 trip 3.300794
#> 12: 1:12:32 3.7848781 trip 3.300794
#> 13: 1:12:33 0.4496923 <NA>       NA

【讨论】:

谢谢!那工作得很好。第一次看到 fifelse 功能。学到了更多。【参考方案2】:

一个dplyr方法:

library(dplyr)

data %>% 
  group_by(temp = with(rle(type), rep(seq_along(lengths), lengths))) %>% 
  mutate(mean = if_else(is.na(type), NA_real_, mean(speedms))) %>% 
  ungroup() %>%
  select(-temp)

# A tibble: 13 x 4
   Time    speedms type   mean
   <chr>     <dbl> <chr> <dbl>
 1 1:12:21   1.10  trip   1.33
 2 1:12:22   1.57  trip   1.33
 3 1:12:23   1.07  NA    NA   
 4 1:12:24   1.17  NA    NA   
 5 1:12:25   1.39  NA    NA   
 6 1:12:26   0.966 trip   1.41
 7 1:12:27   1.26  trip   1.41
 8 1:12:28   2.00  trip   1.41
 9 1:12:29   2.22  NA    NA   
10 1:12:30   1.69  NA    NA   
11 1:12:31   2.82  trip   3.30
12 1:12:32   3.78  trip   3.30
13 1:12:33   0.450 NA    NA  

【讨论】:

以上是关于在R中有条件地计算特定数据范围的平均速度的主要内容,如果未能解决你的问题,请参考以下文章

计算用户平均速度的最快方法是啥?

R基于具有添加条件的特定列合并两个数据集

使用索引为什么能提高查询速度?

Python:解决找到满足特定条件的组合的问题

计算平均速度题

根据R中的记录时间和速度计算汽车加速度