重复一个数字 n 次,然后为 R 中的其余行重复一个不同的数字
repeating a number n times, then a different number for the remainder of the rows in R
我有一个数据集,其中每一行都是对患者的每月观察,监测他们是否对某种疾病(状态)检测呈阳性。
我知道他们是在哪个月份(即每个 ID 的行号 - TimeToDx)被诊断出来的,我想做的是有一个从 0 切换到 1 的二进制指示器,从 TimeToDx 中指示的观察月份开始.
基本上我需要通过 TimeToDx - 1 复制 0,然后为其余行为每个 ID 复制 1。
这是一些示例数据 - 未填充状态指示器:
ID TimeToDx Status
10425 2
10425 2
10425 2
10425 2
10667 3
10667 3
10667 3
10667 3
10667 3
10686 2
10686 2
10686 2
10686 2
10686 2
17096 5
17096 5
17096 5
17096 5
17096 5
这是我想看到的:
ID TimeToDx Status
10425 2 0
10425 2 1
10425 2 1
10425 2 1
10667 3 0
10667 3 0
10667 3 1
10667 3 1
10667 3 1
10686 2 0
10686 2 1
10686 2 1
10686 2 1
10686 2 1
17096 5 0
17096 5 0
17096 5 0
17096 5 0
17096 5 1
如有任何帮助,我们将不胜感激。
这是 dplyr
的一种方法。在每个 ID 内分组,我们将该组内的行与 TimeToDx
进行比较。真 x 1 = 1,假 x 1 = 0。可以交替使用 mutate(Status = if_else(row_number() >= TimeToDx, 1, 0))
.
library(dplyr)
df %>%
group_by(ID) %>%
mutate(Status = 1 * (row_number() >= TimeToDx)) %>%
ungroup()
df <- structure(list(ID = c(10425L, 10425L, 10425L, 10425L, 10667L,
10667L, 10667L, 10667L, 10667L, 10686L, 10686L, 10686L, 10686L,
10686L, 17096L, 17096L, 17096L, 17096L, 17096L),
TimeToDx = c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 2L, 2L,
2L, 2L, 2L, 5L, 5L, 5L, 5L, 5L)),
class = "data.frame", row.names = c(NA, -19L))
library(tidyverse)
df %>%
group_by(ID) %>%
mutate(Status = +((row_number() %/% TimeToDx) != 0)) %>%
ungroup()
#> # A tibble: 19 x 3
#> ID TimeToDx id_row
#> <int> <int> <int>
#> 1 10425 2 0
#> 2 10425 2 1
#> 3 10425 2 1
#> 4 10425 2 1
#> 5 10667 3 0
#> 6 10667 3 0
#> 7 10667 3 1
#> 8 10667 3 1
#> 9 10667 3 1
#> 10 10686 2 0
#> 11 10686 2 1
#> 12 10686 2 1
#> 13 10686 2 1
#> 14 10686 2 1
#> 15 17096 5 0
#> 16 17096 5 0
#> 17 17096 5 0
#> 18 17096 5 0
#> 19 17096 5 1
由 reprex package (v2.0.1)
于 2021-10-21 创建
data.table
使用@Jon Spring 的解决方案
library(data.table)
setDT(df)[, Status := +(rowid(ID) >= TimeToDx)][]
#> ID TimeToDx Status
#> 1: 10425 2 0
#> 2: 10425 2 1
#> 3: 10425 2 1
#> 4: 10425 2 1
#> 5: 10667 3 0
#> 6: 10667 3 0
#> 7: 10667 3 1
#> 8: 10667 3 1
#> 9: 10667 3 1
#> 10: 10686 2 0
#> 11: 10686 2 1
#> 12: 10686 2 1
#> 13: 10686 2 1
#> 14: 10686 2 1
#> 15: 17096 5 0
#> 16: 17096 5 0
#> 17: 17096 5 0
#> 18: 17096 5 0
#> 19: 17096 5 1
由 reprex package (v2.0.1)
于 2021-10-21 创建
我有一个数据集,其中每一行都是对患者的每月观察,监测他们是否对某种疾病(状态)检测呈阳性。
我知道他们是在哪个月份(即每个 ID 的行号 - TimeToDx)被诊断出来的,我想做的是有一个从 0 切换到 1 的二进制指示器,从 TimeToDx 中指示的观察月份开始.
基本上我需要通过 TimeToDx - 1 复制 0,然后为其余行为每个 ID 复制 1。
这是一些示例数据 - 未填充状态指示器:
ID TimeToDx Status
10425 2
10425 2
10425 2
10425 2
10667 3
10667 3
10667 3
10667 3
10667 3
10686 2
10686 2
10686 2
10686 2
10686 2
17096 5
17096 5
17096 5
17096 5
17096 5
这是我想看到的:
ID TimeToDx Status
10425 2 0
10425 2 1
10425 2 1
10425 2 1
10667 3 0
10667 3 0
10667 3 1
10667 3 1
10667 3 1
10686 2 0
10686 2 1
10686 2 1
10686 2 1
10686 2 1
17096 5 0
17096 5 0
17096 5 0
17096 5 0
17096 5 1
如有任何帮助,我们将不胜感激。
这是 dplyr
的一种方法。在每个 ID 内分组,我们将该组内的行与 TimeToDx
进行比较。真 x 1 = 1,假 x 1 = 0。可以交替使用 mutate(Status = if_else(row_number() >= TimeToDx, 1, 0))
.
library(dplyr)
df %>%
group_by(ID) %>%
mutate(Status = 1 * (row_number() >= TimeToDx)) %>%
ungroup()
df <- structure(list(ID = c(10425L, 10425L, 10425L, 10425L, 10667L,
10667L, 10667L, 10667L, 10667L, 10686L, 10686L, 10686L, 10686L,
10686L, 17096L, 17096L, 17096L, 17096L, 17096L),
TimeToDx = c(2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 2L, 2L,
2L, 2L, 2L, 5L, 5L, 5L, 5L, 5L)),
class = "data.frame", row.names = c(NA, -19L))
library(tidyverse)
df %>%
group_by(ID) %>%
mutate(Status = +((row_number() %/% TimeToDx) != 0)) %>%
ungroup()
#> # A tibble: 19 x 3
#> ID TimeToDx id_row
#> <int> <int> <int>
#> 1 10425 2 0
#> 2 10425 2 1
#> 3 10425 2 1
#> 4 10425 2 1
#> 5 10667 3 0
#> 6 10667 3 0
#> 7 10667 3 1
#> 8 10667 3 1
#> 9 10667 3 1
#> 10 10686 2 0
#> 11 10686 2 1
#> 12 10686 2 1
#> 13 10686 2 1
#> 14 10686 2 1
#> 15 17096 5 0
#> 16 17096 5 0
#> 17 17096 5 0
#> 18 17096 5 0
#> 19 17096 5 1
由 reprex package (v2.0.1)
于 2021-10-21 创建data.table
使用@Jon Spring 的解决方案
library(data.table)
setDT(df)[, Status := +(rowid(ID) >= TimeToDx)][]
#> ID TimeToDx Status
#> 1: 10425 2 0
#> 2: 10425 2 1
#> 3: 10425 2 1
#> 4: 10425 2 1
#> 5: 10667 3 0
#> 6: 10667 3 0
#> 7: 10667 3 1
#> 8: 10667 3 1
#> 9: 10667 3 1
#> 10: 10686 2 0
#> 11: 10686 2 1
#> 12: 10686 2 1
#> 13: 10686 2 1
#> 14: 10686 2 1
#> 15: 17096 5 0
#> 16: 17096 5 0
#> 17: 17096 5 0
#> 18: 17096 5 0
#> 19: 17096 5 1
由 reprex package (v2.0.1)
于 2021-10-21 创建