【问题标题】:How to delete all following rows once an observation/condition of interest has reached in the previous row R (right censoring)一旦在前一行 R 中达到观察/感兴趣的条件,如何删除所有后续行(右删失)
【发布时间】:2020-10-26 16:41:29
【问题描述】:

希望您能帮助解决我认为是 dplyr/tidyr 的问题:

问题 一旦进行了第一次感兴趣的观察,我如何有条件地删除以下观察? (右删失)

数据

structure(list(record_id = c(120321, 120321, 120321, 120321, 
120321, 120321, 120321, 120321, 120321, 120321, 120321, 120321, 
120321, 120321, 120321, 120321, 120321, 120321, 120321, 120321, 
120321), day_count = c(579, 580, 581, 582, 583, 584, 585, 586, 
587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599
), day_count_stop = c(580, 581, 582, 583, 584, 585, 586, 587, 
588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600
), te_yn = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
0, 0, 0, 0, 0)), row.names = c(NA, -21L), groups = structure(list(
    record_id = 120321, .rows = structure(list(1:21), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = c(NA, -1L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

解释

所以我实际上从第 0 天到第 732 天跟踪了 record_id 120321。在此示例中,您看到从第 579 天到第 600 天的跟踪天数。

我想在 te_yn 变为 1 之后删除所有行。这是感兴趣的观察。所以在第 584 天,te_yn 变成了 1。我想删除第 585 天直到结束。

最好的祝福

这是一个更大的生存分析问题的一部分。如果有 Cox PH 分析经验并愿意提供帮助,请查看以下链接: Coding help for Cox PH analysis with a categorical time-dependent variable

【问题讨论】:

  • slice(data, 1:which(.$te_yn==1))?但是,您似乎有几个“感兴趣的观察”,并且只会选择第一个。
  • 嗨杜布凯。从第一次感兴趣的观察开始切片正是我想要的!但是,当我使用以下代码进行切片 dataframe <- dataframe %>% slice(data, 1:which(. $te_yn==1)) 时,我收到以下错误:“错误:slice() 表达式应返回索引(正整数或负整数)。”怎么了?

标签: r dplyr tidyr


【解决方案1】:

所以,我假设您必须为不同的 record_id 这样做。在这里,我按此分组。看看这是否适合你。

> library(dplyr)
> df %>% group_by(record_id) %>% filter(if(1 %in% te_yn) row_number() == 1: (which(te_yn == 1) -1) else TRUE)
# A tibble: 15 x 4
# Groups:   record_id [2]
   record_id day_count day_count_stop te_yn
       <dbl>     <dbl>          <dbl> <dbl>
 1    120321       579            580     0
 2    120321       580            581     0
 3    120321       581            582     0
 4    120321       582            583     0
 5    120321       583            584     0
 6    120322       579            580     0
 7    120322       580            581     0
 8    120322       581            582     0
 9    120322       582            583     0
10    120322       583            584     0
11    120322       584            586     0
12    120322       585            587     0
13    120322       586            588     0
14    120322       587            589     0
15    120322       588            590     0
> 

使用的数据:

structure(list(record_id = c(120321, 120321, 120321, 120321, 
120321, 120321, 120321, 120321, 120321, 120321, 120321, 120321, 
120321, 120321, 120321, 120321, 120321, 120321, 120321, 120321, 
120321, 120322, 120322, 120322, 120322, 120322, 120322, 120322, 
120322, 120322, 120322), day_count = c(579, 580, 581, 582, 583, 
584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 
597, 598, 599, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588
), day_count_stop = c(580, 581, 582, 583, 584, 585, 586, 587, 
588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 
580, 581, 582, 583, 584, 586, 587, 588, 589, 590), te_yn = c(0, 
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -31L), class = c("tbl_df", 
"tbl", "data.frame"))

已在原始数据中添加了额外的组。

【讨论】:

  • 谢谢,我已经删除了最后一个-1,以包含感兴趣的结果。
  • 哦,我明白了:所以你告诉 R 从第一行过滤到 te_yn == 1 的行。谢谢
  • 我在较大的数据库中遇到错误。这是错误和回溯:Error: Problem with filter()` 输入..1。 x 长度为 0 的参数 ℹ 输入 ..1row_number() == 1:(which(te_yn == 1))。 ℹ 错误发生在第1组:record_id = 110001。运行rlang::last_error()查看错误发生在哪里。我认为问题在于 110001 没有感兴趣的事件。所以 te_yn 在整个后续过程中保持为 0。这应该如何纠正?
  • @KBChu,所以我添加了没有 te_yn 值为 1 的其他组,在我的答案中发布了数据和输出。请立即检查。
  • @KBChu,奇怪,我没有收到任何警告,但如果对你有用,请你接受我的回答。
猜你喜欢
  • 2022-08-31
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2019-12-10
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多