【问题标题】:Select the optimal number based on conditions根据条件选择最佳数量
【发布时间】:2022-01-06 12:39:29
【问题描述】:

这是我的最小数据集:

df=structure(list(ID = c(3942504L, 3199413L, 1864266L, 4037617L, 
2030477L, 1342330L, 5434070L, 3200378L, 4810153L, 4886225L), 
    MI_TIME = c(1101L, 396L, 1140L, 417L, 642L, 1226L, 1189L, 
    484L, 766L, 527L), MI_Status = c(0L, 0L, 1L, 0L, 0L, 0L, 
    0L, 0L, 1L, 0L), Stroke_status = c(1L, 0L, 1L, 0L, 0L, 0L, 
    0L, 1L, 1L, 0L), Stroke_time = c(1101L, 396L, 1140L, 417L, 
    642L, 1226L, 1189L, 484L, 766L, 527L), Arrhythmia_status = c(NA, 
    NA, TRUE, NA, NA, TRUE, NA, NA, TRUE, NA), Arrythmia_time = c(1101L, 
    356L, 1122L, 7L, 644L, 126L, 118L, 84L, 76L, 5237L)), row.names = c(NA, 
10L), class = "data.frame")

如你所见,我主要有两种类型的变量“_status”和“_time”。

我正在为生存分析准备我的数据集,“时间”是以天为单位的时间。

但是当我尝试创建一个名为“任何心血管结果”(df$CV) 的变量时,问题就出现了,我将其定义如下:

df$CV = NA
df$CV <- with(df, ifelse(MI_Status=='1' | Stroke_status=='1' | Arrhythmia_status== 'TRUE'  ,'1', '0'))              
df$CV = as.factor(df$CV)

我遇到的问题是选择最佳的活动时间。现在我有一个名为df$CV 的新变量,但有3 个不同的“_time”变量。 所以我想创建一个名为df$CV_time 的新列,其中时间是最先发生的事件的时间。 不过这个问题有一点难度,我举个例子:

如果我们有 MI_status==1Arrythmia_status==NAstroke_status==1MI_time==200Arrythmia_time==100stroke_time==220 的主题 --> df$CV 的正确时间是 200,因为它是最早事件的时间。

但是,在MI_status==0Arrythmia_status==NAstroke_status==0MI_time==200Arrythmia_time==100stroke_time==220 的情况下,df$CV 的正确时间将是 220,因为最近的跟进时间是220天。

如何根据这些条件为 df$CV 选择最佳数量?

【问题讨论】:

    标签: r if-statement conditional-statements multiple-columns


    【解决方案1】:

    这可能是使用tidyverse 的一种方法。

    首先,您可能需要确保列名与拼写和大小写一致(此处使用rename)。

    然后,您可以将“心律失常”结果明确定义为TRUEFALSE(而不是使用NA)。

    您可以使用pivot_longer 将您的数据放入长格式,然后使用group_by 您的ID。您可以在此处包括与 MI、中风和心律失常相关的特定列(其中有“时间”和“状态”列可用)。请注意,在您的实际数据集中(您使用 glimpse - 不清楚您想要什么用于心律失常 - 有一个 pif 列名称,但没有具体的时间或状态)。

    您的心血管结果将包括 MI 或中风状态为 1,或心律失常状态为 TRUE

    如果有心血管结果,事件发生时间将是 min 时间,否则使用最近随访的删失时间或 max 时间。

    让我知道这是否为您提供了所需的输出。

    library(tidyverse)
    
    df %>%
      rename(MI_time = MI_TIME, MI_status = MI_Status, Arrhythmia_time = Arrythmia_time) %>%
      replace_na(list(Arrhythmia_status = F)) %>%
      pivot_longer(cols = c(starts_with("MI_"), starts_with("Stroke_"), starts_with("Arrhythmia_")), 
                   names_to = c("event", ".value"), 
                   names_sep = "_") %>%
      group_by(ID) %>%
      summarise(
        any_cv_outcome = any(status[event %in% c("MI", "Stroke")] == 1 | status[event == "Arrhythmia"]),
        cv_time_to_event = ifelse(any_cv_outcome, min(time), max(time))
      )
    

    输出

            ID any_cv_outcome cv_time_to_event
         <int> <lgl>                     <int>
     1 1342330 TRUE                        126
     2 1864266 TRUE                       1122
     3 2030477 FALSE                       644
     4 3199413 FALSE                       396
     5 3200378 TRUE                         84
     6 3942504 TRUE                       1101
     7 4037617 FALSE                       417
     8 4810153 TRUE                         76
     9 4886225 FALSE                      5237
    10 5434070 FALSE                      1189
    

    【讨论】:

    • 非常感谢!此解决方案给我一个错误:错误:无法组合 date_0 height_0 。运行rlang::last_error() 以查看错误发生的位置。另外: 警告信息: 1:预计 2 件。在 72 行中丢弃的附加件 [1, 2, 3, 5, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, ... ]。 2:预计 2 件。在 3 行 [62, 63, 64] 中填充了 NA 的缺失部分。
    • 谢谢,本。我已经用一瞥输出更新了帖子(没有数据,因为它是机密的抱歉!)
    • @Lili 查看已编辑的答案。您可以指定与pivot_longer 一起使用的列。对于 MI 和中风,这看起来应该可以工作。但我在您的数据集中没有看到arrhythmnia_timearrhythmia_status,只有Arrhythmia_pif
    • 现在完美运行! - 太感谢了! :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-16
    • 2019-06-21
    • 2018-04-24
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多