R语言 有没有一种方法可以根据两个条件和现有的时间变量来创建时间值?

lh80um4z  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

我是R的新手,我试图找到一个参与者(ID)在一个路口等待多长时间,如果他们的速度小于2 KPH。然后我想为这个时间框架创建一个新的变量,这将是“等待时间(s)”。我计划根据他们的组和经验比较参与者的等待时间。下面是我的变量和数据的简化数据集。
| ID|组|经验|结|速度(KPH)|时间(秒)|
| --|--|--|--|--|--|
| 1 | 1 | 1 |ROW 1-A| 5 |五十七点二|
| 1 | 1 | 1 |ROW 1-A| 4 |58.2|
| 1 | 1 | 1 |ROW 1-A| 3 |五十九点二|
| 1 | 1 | 1 |ROW 1-A| 2 |60.2|
| 1 | 1 | 1 |ROW 1-A| 1 |61.2|
| 1 | 1 | 1 |ROW 1-A| 0 |62.2|
| 1 | 1 | 1 |ROW 1-A| 0 |63.2|
| 1 | 1 | 1 |ROW 1-A| 1 |64.2|
| 1 | 1 | 1 |ROW 1-A| 2 |六十五点二|
| 1 | 1 | 1 |ROW 1-A| 3 |66.2|
| 1 | 1 | 1 |ROW 1-A| 4 |六十七点二|
| 1 | 1 | 1 |ROW 1-A| 5 |68.2|
| 2 | 2 | 2 |ROW 1-A| 3 |二十六点五|
| 2 | 2 | 2 |ROW 1-A| 2 |二十七点五|
| 2 | 2 | 2 |ROW 1-A| 1 |二十八点五|
| 2 | 2 | 2 |ROW 1-A| 0 |二十九点五|
| 2 | 2 | 2 |ROW 1-A| 0 |三十点五|
| 2 | 2 | 2 |ROW 1-A| 0 |三十一点五|
| 2 | 2 | 2 |ROW 1-A| 0 |三十二点五|
| 2 | 2 | 2 |ROW 1-A| 1 |三十三点五|
| 2 | 2 | 2 |ROW 1-A| 2 |三十四点五|
| 2 | 2 | 2 |ROW 1-A| 3 |三十五点五|
在真实的数据集中,有13个不同的交叉点名称(例如,ROW 1-A、ROW 2-A、GW 1-L、GW 2-R)。
每个参与者的时间变量是线性的,但是每个参与者在不同的时间开始。在这个例子中,对于参与者1,小于2 KPH的时间范围在61.2和64.2之间,等待时间为3秒,而对于参与者2,时间范围在28.5和33.5之间,等待时间为5秒。新变量需要将3秒与5秒。
有没有人可以在R/Rstudio中开发一些代码?
先谢了。

gkn4icbw

gkn4icbw1#

这种方法使用dplyr包,并将给予您一个汇总表,以实现您想要的。我已经根据您的描述创建了一个“虚拟”数据集,以说明它在更有代表性的数据上的工作。我还修改了您的列名;避免列名中的标点符号是一个很好的做法,它使编码更容易:

install.packages("dplyr") # Run this only if you don't have dplyr installed already
library(dplyr)

# 'Dummy' data
df <- data.frame(ID = rep(1:10, each = 11),
                 group = rep(1:2, each = 11),
                 experience = rep(1:4, each = 11,  length.out = 110),
                 Junction = rep(c("ROW1-A", "ROW2-A", "ROW3-A","GW1-L", "GW2-R"), each = 22),
                 speed_KPH = rep(c(c(5:0,1:5), 
                                   c(4:0,0,0,1:4), 
                                   c(3:0,0,0,0,0,1:3), 
                                   c(2:0,0,0,0,0,0,0,1:2)), length.out = 110),
                 time_s = seq(1.5, 110.5, by = 1))

head(df)
  ID group experience Junction speed_KPH time_s
1  1     1          1   ROW1-A         5    1.5
2  1     1          1   ROW1-A         4    2.5
3  1     1          1   ROW1-A         3    3.5
4  1     1          1   ROW1-A         2    4.5
5  1     1          1   ROW1-A         1    5.5
6  1     1          1   ROW1-A         0    6.5

# Summary df
df1 <- df %>%
  filter(speed_KPH < 2) %>% # return required range
  group_by(ID, Junction) %>% # group by person ID
  mutate(waiting_time_s = max(time_s) - min(time_s)) %>% # calculate time difference
  select(-c(speed_KPH, time_s)) %>% # Remove unneeded columns
  distinct() %>% # return one record per ID
  ungroup()

# Result
data.frame(df1)
   ID group experience Junction waiting_time_s
1   1     1          1   ROW1-A              2
2   2     2          2   ROW1-A              4
3   3     1          3   ROW2-A              6
4   4     2          4   ROW2-A              8
5   5     1          1   ROW3-A              2
6   6     2          2   ROW3-A              4
7   7     1          3    GW1-L              6
8   8     2          4    GW1-L              8
9   9     1          1    GW2-R              2
10 10     2          2    GW2-R              4

字符串

相关问题