df <- structure(list(ID = c(2L, 2L, 13L, 13L, 13L, 21L, 21L, 21L, 24L,
24L, 24L, 24L), mignr = c(1L, 0L, 1L, 2L, 0L, 0L, 2L, 1L, 2L,
3L, 0L, 1L), start = c(1387L, 903L, 1357L, 1391L, 1087L, 936L,
1367L, 1354L, 1363L, 1392L, 908L, 1361L), end = c(1401L, 1386L,
1390L, 1401L, 1356L, 1353L, 1399L, 1366L, 1391L, 1400L, 1360L,
1362L), staytime = c(15L, 484L, 34L, 11L, 270L, 418L, 33L, 13L,
29L, 9L, 453L, 2L)), row.names = c(NA, -12L), class = "data.frame")
我的目标是重置这个法术数据集中的序列,使它们都从零开始,并且对于大于1的mignr,停留时间会增加。数据按ID分组,mignr代表法术中的序列。我已经为第一个法术(mignr == 0)设置了start == 0 end == 1,并且希望对于每个后续的法术
- start是前一个end + 1
- 结束为开始+(停留时间-1)
df <- df %>%
mutate(start = ifelse(mignr == 0, 0, start)) %>%
mutate(end = ifelse(mignr == 0, 1, end))
max_spell <- max(df$mignr)
for(i in seq_along(1:max_spell)){
j <- i-1
df <- df %>%
mutate(start = ifelse(mignr == i, (df[which(df$ID == ID & df$mignr == j),4]), start)) %>%
mutate(end = ifelse(mignr == i, start + (staytime - 1), end))
}
df
我的尝试似乎对mignr = 1起作用,开始和结束值都是我所期望的。但是对于mignr(〉1)的后续值,开始值不再是我所期望的。我目前计算开始值的方法不是很清楚,但是我不太清楚为什么对于后续的迭代,它会中断。
1条答案
按热度按时间mrphzbgm1#
我会在
staytime
上使用cumsum()
,但要使其工作,我需要将mignr == 0
的第一个staytime
更改为1
,因为这基本上就是将第一个start
和end
设置为0
和1
的含义。数据来自OP
由reprex package(v2.0.1)于2023年2月20日创建