在 R 中使用 dplyr 替换时间点

Replace time points using dplyr in R

我的数据框是这样的

value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(1,1,1,1,2,2,2,2,3,3,3,3)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)
test

   value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    2  1
6   0.05    2  2
7   0.05    2  3
8   0.50    2  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

在这个例子中,我的时间序列从“1”开始,到“3”结束。我想将列 'time' 和我的时间序列替换为从“0”开始到“2”结束。我希望我的时间序列看起来像这样

   value time ID
1   0.00    0  1
2   0.10    0  2
3   0.20    0  3
4   0.40    0  4
5   0.00    1  1
6   0.05    1  2
7   0.05    1  3
8   0.50    1  4
9   0.20    2  1
10  0.40    2  2
11  0.50    2  3
12  0.60    2  4
test %>%
  mutate(time = time - min(time))
#    value time ID
# 1   0.00    0  1
# 2   0.10    0  2
# 3   0.20    0  3
# 4   0.40    0  4
# 5   0.00    1  1
# 6   0.05    1  2
# 7   0.05    1  3
# 8   0.50    1  4
# 9   0.20    2  1
# 10  0.40    2  2
# 11  0.50    2  3
# 12  0.60    2  4

使用time-min(time)将始终确保第一次是0,即使不是从1开始。

另一种选择是使用 match :

library(dplyr)
test %>% mutate(time = match(time, unique(time)) - 1)

#   value time ID
#1   0.00    0  1
#2   0.10    0  2
#3   0.20    0  3
#4   0.40    0  4
#5   0.00    1  1
#6   0.05    1  2
#7   0.05    1  3
#8   0.50    1  4
#9   0.20    2  1
#10  0.40    2  2
#11  0.50    2  3
#12  0.60    2  4

当您有一个不连续的时间序列(如 1、3、4)时,这会很有帮助。使用 match 它将把它排列在 0、1、2 中。