【问题标题】:Two string columns with stored datapoints - access one by the other存储数据点的两个字符串列 - 一个接一个访问
【发布时间】:2025-12-19 23:55:12
【问题描述】:

我有一个数据框,基本上有两列,一列是“日期”,另一列是“疾病等级”。

它们的编码如下:

Date Grade
2017-10-14=&=2018-01-20=&==&= 1=&=2=&==&=
2018-10-14=&=2019-01-20=&=2020-01-01=&= 2=&=3=&=4=&=

我寻找一个代码来访问与第二列中的成绩相对应的第一列中的日期。 此外,如果能够提取日期,例如疾病等级为2第一次。

我尝试了 str_split(... sep = "=&=) 并最终得到一个包含所有不同日期和等级的矩阵。

我需要提取以下内容:

  1. 用于时变分析
Follow_up_1 Grade_1 Follow_up_2 Grade_2 Follow_up_3 Grade_3
2017-10-14 1 2018-01-20 2 NA NA
2018-10-14 2 2019-01-20 3 2020-01-01 4
  1. max_grade 和 max_grade 的日期
Date_max_grade Max_grade
2018-01-20 2
2020-01-01 4
  1. 提取第一个日期,其中对应的等级是 3 或 4。
First_Date_3_or_4
NA
2019-01-20
2020-01-01

提前致谢,

一月

【问题讨论】:

    标签: r string matrix strsplit


    【解决方案1】:

    数据:

    df <- tribble(
      ~Date,    ~Grade,
      "2017-10-14=&=2018-01-20=&==&=",  "1=&=2=&==&=",
        "2018-10-14=&=2019-01-20=&=2020-01-01=&=",  "2=&=3=&=4=&="
    )
    

    设置:

    library(tidyverse)
    
    df <- df %>% 
      mutate(
        across(everything(), ~str_split(.x, pattern = "=&=") %>% map(~.x[.x != ""]))
      ) %>%
      pmap(~data.frame(...)) %>%
      imap_dfr(~mutate(.x, group = .y, group_id = row_number())) %>%
      mutate(
        Grade = as.integer(as.character(Grade)),
        Date = as.Date(Date)
      )
    

    第一个问题:

    df %>%
      pivot_wider(
        id_cols = group,
        names_from = group_id,
        names_glue = "{.value}_{group_id}",
        values_from = c(Date, Grade)
      ) %>%
      select(-group)
    

    第二个问题:

    df %>%
      group_by(group) %>%
      filter(Grade == max(Grade)) %>%
      ungroup() %>%
      select(Date, Grade)
    

    第三个问题:我不确定你到底想要什么

    df %>%
      group_by(group, Grade) %>%
      filter(Grade %in% c(3, 4)) %>%
      ungroup() %>%
      select(-group_id) %>%
      right_join(data.frame(group = unique(df$group)), by = "group")
    

    【讨论】:

    • 谢谢!一旦我再次处理代码部分,我将更新帖子。
    最近更新 更多