R语言 如何根据起始数字在列中创建重复数字序列?

bpzcxfmw  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(131)

考虑以下情况:

library(tidyverse)

treatment <- c(0,0,0,0,1,0,0,0,0,0,0,0,0,0,0)
desired <- c(0,0,0,0,1,1,1,2,2,2,3,3,3,4,4)

df_treatment <- tibble(treatment, desired)

df <- df_treatment %>% 
  mutate(date = seq(as_date("2016-01-01"), as_date("2016-01-15") , by= "day"))

我的目标是获取df tibble中的desired列。当然,我希望通过编程来获取它。此外,我希望灵活地使用每个数字重复的次数。例如,我可能希望将数字重复4次而不是3次。
虽然这看起来是一个奇怪的问题,但我正在试图找到在更大的数据集中获得“过去/治疗时间”列的最佳方法。我现在的想法是创建一个从治疗开始日期开始的数字序列。desired列中的每个唯一数字都是一个bin,而每个唯一数字重复的次数是每个bin中的观察次数。
出于某种原因,当我尝试创建这样的东西时,我似乎无法将数字从正确的位置开始:

df %>% 
  mutate(desired_attempt = ifelse(date >= as_date("2016-01-05"), rep(1:4, each = 3), 0))
u59ebvdq

u59ebvdq1#

a <- cumsum(treatment)
b <- sum(a)
replace(treatment, a>0, rep(seq_len(b), each=3, length = b))
[1] 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4
von4xj4u

von4xj4u2#

df %>% 
  group_by(treatment_started = date >= "2016-01-03") %>% 
  mutate(desired_attempt = if (first(treatment_started)) rep(1:1e3, each = 3, length.out = n()) else 0)
# A tibble: 15 × 5
# Groups:   treatment_started [2]
   treatment desired date       treatment_started desired_attempt
       <dbl>   <dbl> <date>     <lgl>                       <dbl>
 1         0       0 2016-01-01 FALSE                           0
 2         0       0 2016-01-02 FALSE                           0
 3         0       0 2016-01-03 TRUE                            1
 4         0       0 2016-01-04 TRUE                            1
 5         1       1 2016-01-05 TRUE                            1
 6         0       1 2016-01-06 TRUE                            2
 7         0       1 2016-01-07 TRUE                            2
 8         0       2 2016-01-08 TRUE                            2
 9         0       2 2016-01-09 TRUE                            3
10         0       2 2016-01-10 TRUE                            3
11         0       3 2016-01-11 TRUE                            3
12         0       3 2016-01-12 TRUE                            4
13         0       3 2016-01-13 TRUE                            4
14         0       4 2016-01-14 TRUE                            4
15         0       4 2016-01-15 TRUE                            5

或者用碱基R:

df$desired_attempt <- 0
df$desired_attempt[df$date >= "2016-01-03"] <- rep(1:1e3, each = 3, length.out = sum(df$date >= "2016-01-03"))

相关问题