存储数据点的两个字符串列 - 一个接一个访问

Posted

技术标签:

【中文标题】存储数据点的两个字符串列 - 一个接一个访问【英文标题】:Two string columns with stored datapoints - access one by the other 【发布时间】:2021-08-30 07:34:28 【问题描述】:

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

它们的编码如下:

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 = "=&=) 并最终得到一个包含所有不同日期和等级的矩阵。

我需要提取以下内容:

    用于时变分析
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
    max_grade 和 max_grade 的日期
Date_max_grade Max_grade
2018-01-20 2
2020-01-01 4
    提取第一个日期,其中对应的等级是 3 或 4。
First_Date_3_or_4
NA
2019-01-20
2020-01-01

提前致谢,

一月

【问题讨论】:

【参考方案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")

【讨论】:

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

以上是关于存储数据点的两个字符串列 - 一个接一个访问的主要内容,如果未能解决你的问题,请参考以下文章

从数据框字符串列中提取特定单词并存储在 Python 的新列中

如何在pyspark中将字符串列转换为ArrayType

Mysql查询优化小结

当字符串列内容长于已经存在的内容时,HDFStore.append(string, DataFrame) 失败

使用带有json字符串列的中继器

在单个 spark 数据框中减去两个字符串列的最佳 PySpark 实践是啥?