假设我有d个:

> d
  pnr age.hl age.hl.time kon.hl kon.hl.time sen.hl sen.hl.time mix.hl mix.hl.time
1   A      0  2018-12-31      1  2011-02-01      0  2018-12-31      0  2018-12-31
2   A      1  2013-10-31      0  2018-12-31      0  2018-12-31      1  2013-10-31
3   A      0  2018-12-31      0  2018-12-31      1  2016-09-30      0  2018-12-31
4   B      0  2018-12-31      0  2018-12-31      1  2004-04-30      0  2018-12-31
5   C      0  2018-12-31      0  2018-12-31      0  2018-12-31      1  2006-01-17
6   C      1  2008-07-31      0  2018-12-31      1  2009-01-31      0  2018-12-31

d$pnr是唯一的患者标识符.age.hlkon.hlsen.hlmix.hl表示不同的疾病及其对应的时间变量.如果发生0事件,所有患者的审查频率为2018-12-31.

如果在任何一列中出现1,则它不能再次出现在same列中.

我需要合并行,所以d$pnr只出现一次.即,每列的事件数据/信息应合并到同一行.

我希望在dplyr年内找到解决方案.

Expected output:

  pnr age.hl age.hl.time kon.hl kon.hl.time sen.hl sen.hl.time mix.hl mix.hl.time
1   A      1  2013-10-31      1  2011-02-01      1  2016-09-30      1  2013-10-31
2   B      0  2018-12-31      0  2018-12-31      1  2004-04-30      0  2018-12-31
3   C      1  2008-07-31      0  2018-12-31      1  2009-01-31      1  2006-01-17

Data

d <- data.frame(
  pnr = c("A", "A", "A", "B", "C", "C"),
  age.hl = c(0, 1, 0, 0, 0, 1),
  age.hl.time = c(as.Date("2018-12-31"), as.Date("2013-10-31"), as.Date("2018-12-31"),
                  as.Date("2018-12-31"), as.Date("2018-12-31"), as.Date("2008-07-31")),
  kon.hl = c(1, 0, 0, 0, 0, 0),
  kon.hl.time = c(as.Date("2011-02-01"), as.Date("2018-12-31"), as.Date("2018-12-31"),
                  as.Date("2018-12-31"), as.Date("2018-12-31"), as.Date("2018-12-31")),
  sen.hl = c(0, 0, 1, 1, 0, 1),
  sen.hl.time = c(as.Date("2018-12-31"), as.Date("2018-12-31"), as.Date("2016-09-30"),
                  as.Date("2004-04-30"), as.Date("2018-12-31"), as.Date("2009-01-31")),
  mix.hl = c(0, 1, 0, 0, 1, 0),
  mix.hl.time = c(as.Date("2018-12-31"), as.Date("2013-10-31"), as.Date("2018-12-31"),
                  as.Date("2018-12-31"), as.Date("2006-01-17"), as.Date("2018-12-31"))
)

推荐答案

您可以使用which.max():

library(dplyr)

d %>%
  summarise(across(ends_with("time"), ~ .x[which.max(get(sub(".time", "", cur_column())))]),
            across(ends_with("hl"), max),
            .by = pnr) %>%
  select(names(d))

#   pnr age.hl age.hl.time kon.hl kon.hl.time sen.hl sen.hl.time mix.hl mix.hl.time
# 1   A      1  2013-10-31      1  2011-02-01      1  2016-09-30      1  2013-10-31
# 2   B      0  2018-12-31      0  2018-12-31      1  2004-04-30      0  2018-12-31
# 3   C      1  2008-07-31      0  2018-12-31      1  2009-01-31      1  2006-01-17

Note:第一个across()中的函数涉及第二个across()中的值,因此这两个across()not可交换的.

R相关问答推荐

pdf Quarto中的中心美人鱼

如何生成包含可能条目列表而不是计数的表?

在ComplexHeatmap中,如何更改anno_barplot()标题的Angular ?

保存包含循环和ifelse的函数的输出

名称输出pmap on tible

从开始时间和结束时间导出时间

R中的子集文件—读取文件名索引为4位数字序列,例如0001到4000,而不是1到4000)

gganimate在使用shadow_mark选项时不保留所有过go 的标记

R s iml包如何处理语法上无效的因子级别?'

如何在Chart_Series()中更改轴值的 colored颜色 ?

在df中保留原始变量和新变量

根据元素和前一个值之间的差值过滤矩阵的元素

从圆到R中的多边形的标绘雷达图

为什么在BASE R中绘制线条时会看到线上的点?

以不同于绘图中元素的方式对GG图图例进行排序

如何提取R中其他字符串和数字之间的字符串?

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

构建一个6/49彩票模拟系统

填充图例什么时候会有点?

分隔日期格式为2020年7月1日