R语言 重新编号拼写数据集中的序列

ws51t4hk  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(156)
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)的后续值,开始值不再是我所期望的。我目前计算开始值的方法不是很清楚,但是我不太清楚为什么对于后续的迭代,它会中断。

mrphzbgm

mrphzbgm1#

我会在staytime上使用cumsum(),但要使其工作,我需要将mignr == 0的第一个staytime更改为1,因为这基本上就是将第一个startend设置为01的含义。

library(tidyverse)

df %>% 
  group_by(ID) %>% 
  arrange(mignr, ,.by_group = TRUE) %>% 
  mutate(start = (row_number()- 1L),
         staytime = ifelse(row_number() == 1, 1, staytime),
         end = cumsum(staytime),
         start = lag(end + 1, default = first(start)))

#> # A tibble: 12 x 5
#> # Groups:   ID [4]
#>       ID mignr start   end staytime
#>    <int> <int> <dbl> <dbl>    <dbl>
#>  1     2     0     0     1        1
#>  2     2     1     2    16       15
#>  3    13     0     0     1        1
#>  4    13     1     2    35       34
#>  5    13     2    36    46       11
#>  6    21     0     0     1        1
#>  7    21     1     2    14       13
#>  8    21     2    15    47       33
#>  9    24     0     0     1        1
#> 10    24     1     2     3        2
#> 11    24     2     4    32       29
#> 12    24     3    33    41        9

数据来自OP

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")

reprex package(v2.0.1)于2023年2月20日创建

相关问题