基于距离列计算圈数

3

我有一个数据框,其中包含关于比赛的信息,其中一列显示了在特定时间点驾驶汽车行驶的距离。它看起来像这样:

data.frame(id = rep(c("A"), each = 15), 
           distance = seq(from = 1, to = 20, length.out = 15))

   id  distance 
1   A  1.000000   
2   A  2.357143   
3   A  3.714286   
4   A  5.071429   
5   A  6.428571   
6   A  7.785714   
7   A  9.142857   
8   A 10.500000   
9   A 11.857143   
10  A 13.214286   
11  A 14.571429   
12  A 15.928571   
13  A 17.285714   
14  A 18.642857   
15  A 20.000000   

如果我知道一圈的距离是5个单位,我想创建一个新列,根据驾驶的距离确定每个数据点所采取的圈数。结果应如下所示:
data.frame(id = rep("A", each = 15), 
           distance = seq(from = 1, to = 20, length.out = 15), 
           lap = c(1,1,1,2,2,2,2,3,3,3,3,4,4,4,4))

   id  distance lap
1   A  1.000000   1
2   A  2.357143   1
3   A  3.714286   1
4   A  5.071429   2
5   A  6.428571   2
6   A  7.785714   2
7   A  9.142857   2
8   A 10.500000   3
9   A 11.857143   3
10  A 13.214286   3
11  A 14.571429   3
12  A 15.928571   4
13  A 17.285714   4
14  A 18.642857   4
15  A 20.000000   4

我该怎么做,最好使用tidyverse?

1
如果你有一个四舍五入的值,例如 5,应该是 1 还是 2? - Onyambu
2个回答

7
这是一个整数除法问题。只需将距离除以5,然后取 ceiling,这会将其四舍五入到最接近的整数。这将给出当前圈数:
dplyr::mutate(df, lap = ceiling(distance/5))

   id  distance lap
1   A  1.000000   1
2   A  2.357143   1
3   A  3.714286   1
4   A  5.071429   2
5   A  6.428571   2
6   A  7.785714   2
7   A  9.142857   2
8   A 10.500000   3
9   A 11.857143   3
10  A 13.214286   3
11  A 14.571429   3
12  A 15.928571   4
13  A 17.285714   4
14  A 18.642857   4
15  A 20.000000   4

0
另一个选项是使用group_by()case_when()between()
代码:
df_desired = df %>% 
  group_by(id, distance,
  lap = case_when(between(distance, 1, 5)~"1",
                  between(distance, 5, 10)~ "2",
                  between(distance, 10, 15)~"3",
                  between(distance, 15, 20)~"4"))

# Desired output

# A tibble: 15 × 3
# Groups:   id, distance, lap [15]
   id    distance lap  
   <chr>    <dbl> <chr>
 1 A         1    1    
 2 A         2.36 1    
 3 A         3.71 1    
 4 A         5.07 2    
 5 A         6.43 2    
 6 A         7.79 2    
 7 A         9.14 2    
 8 A        10.5  3    
 9 A        11.9  3    
10 A        13.2  3    
11 A        14.6  3    
12 A        15.9  4    
13 A        17.3  4    
14 A        18.6  4    
15 A        20    4 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接