在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中有条件地计算特定数据范围的平均速度的主要内容,如果未能解决你的问题,请参考以下文章