首页 > 解决方案 > R中的函数,用于根据数据是否符合范围标准为数据分配值

问题描述

我有一个数据集,其中包含 24 名运动员的训练数据,每秒记录一次心率。

date start.time secs    athlete heart_rate
1 2020-01-06  05:30:04     0 John Smith     92.000
2 2020-01-06  05:30:04     1 John Smith     93.500
3 2020-01-06  05:30:04     2 John Smith     95.000
4 2020-01-06  05:30:04     3 John Smith     95.125
5 2020-01-06  05:30:04     4 John Smith     95.250
6 2020-01-06  05:30:04     5 John Smith     95.375

在这data.frame总共 600 万行数据中,大约有 1200 个会话。我还有一个tibble包含每个运动员的个性化心率区。有 5 个心率区域,T1 - T5,每个区域都有最小值和最大值。

  athlete    T1.HRmin T1.HRmax T2.HRmin T2.HRmax T3.HRmin T3.HRmax T4.HRmin T4.HRmax T5.HRmin T5.HRmax
  <chr>         <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 John Smith      108      136      137      149      150      161      162      166      167      220
2 Joe Bloggs      139      159      160      175      176      189      190      194      195      220
3 Billy Bob       134      160      161      178      179      194      195      200      201      220
4 Jane Doe        124      146      147      163      164      172      173      177      178      200
5 Sam Smith       124      154      155      164      165      180      181      186      187      201
6 Harry Hat       116      148      149      165      166      177      178      182      183      220

我想在主目录中创建一个新列,data.frame通过HR.zone查找指定的个性化心率区域中的心率值来确定运动员所处的心率区域。分配的值将是T0- 对于小于T1.HRmin, T1, T2,的值T3,对于 rspecitve 值。T4T5

我还想总结在每个 HR 区域中花费的时间。即每位运动员在心率区 T2 中花费多长时间。

我不知道从哪里开始,或者是否可以使用我拥有的格式。感谢任何帮助。谢谢

标签: rfunctionrange

解决方案


假设第一个数据帧被调用df,第二个数据帧被调用range,我们可以得到range分离心率的最小和最大列的长格式,df根据athlete名称将其连接起来。我们可以findInterval用来知道哪个Theart_rate存在并只选择唯一的行。

library(dplyr)

df %>%
  left_join(range %>% 
            tidyr::pivot_longer(cols = starts_with('T'), 
                                names_to = c('col', '.value'), 
                                names_sep = '\\.'), by = 'athlete') %>%
   group_by(athlete) %>%
   mutate(val = paste0('T', findInterval(heart_rate, sort(HRmin)))) %>%
   distinct(date, start.time, secs, athlete, heart_rate, val)

推荐阅读