1

我有一个 R 数据框,它有一个 ID 列,其中包含多个 ID 记录。当 ID 的标志设置为 1 时,我想创建一个从 1 开始并以 6 为增量顺序增加的新时间轴(1、6、12 ...)。如何使用 dplyr 在 R 中实现这一点?

下面是一个示例数据框

ID 时间点 旗帜
一个 0 0
一个 6 0
一个 12 0
一个 18 1
一个 24 0
一个 30 0
一个 36 0

预期的数据框

ID 时间点 旗帜 新时间点
一个 0 0
一个 6 0
一个 12 0
一个 18 1 1
一个 24 0 6
一个 30 0 12
一个 36 0 18
4

2 回答 2

3

一个选项是按“ID”分组,创建lag“时间点”,n指定为“标志”的位置,其中值为 1 (-1)

library(dplyr)
df1 %>% 
   group_by(ID) %>% 
   mutate(New_Timepoint = dplyr::lag(replace(Timepoint, !Timepoint, 1),
           n = which(Flag == 1)-1)) %>%
   ungroup

-输出

# A tibble: 7 x 4
#  ID    Timepoint  Flag New_Timepoint
#  <chr>     <int> <int>         <dbl>
#1 A             0     0            NA
#2 A             6     0            NA
#3 A            12     0            NA
#4 A            18     1             1
#5 A            24     0             6
#6 A            30     0            12
#7 A            36     0            18

或者使用双精度cumsum创建索引

df1 %>% 
   group_by(ID) %>% 
   mutate(New_Timepoint = Timepoint[na_if(cumsum(cumsum(Flag)), 0)]) %>%
   ungroup

数据

df1 <- structure(list(ID = c("A", "A", "A", "A", "A", "A", "A"), 
    Timepoint = c(0L, 
6L, 12L, 18L, 24L, 30L, 36L), 
     Flag = c(0L, 0L, 0L, 1L, 0L, 0L, 
0L)), class = "data.frame", row.names = c(NA, -7L))
于 2021-05-26T19:48:00.850 回答
2

另一种dplyr选择

df %>%
  group_by(ID) %>%
  mutate(New_Timepoint = pmax(1, Timepoint - c(NA, Timepoint[Flag == 1])[cumsum(Flag) + 1])) %>%
  ungroup()

  ID    Timepoint  Flag New_Timepoint
  <chr>     <int> <int>         <dbl>
1 A             0     0            NA
2 A             6     0            NA
3 A            12     0            NA
4 A            18     1             1
5 A            24     0             6
6 A            30     0            12
7 A            36     0            18
于 2021-05-26T19:54:40.267 回答