r dplyr group_by 值折叠并粘贴

r dplyr group_by values collapse and paste

我有一个看起来像这样的数据集

Id   Subject    Date        Vitals       Value
10   John       2001-05-29  HeartRate    65
10   John       2001-05-29  HeartRate    68
10   John       2001-05-29  BP-Arterial  48
10   John       2001-05-29  PulseRate    64
34   Pete       2005-08-15  HeartRate    68
34   Pete       2005-08-15  BP-Arterial  56
10   John       2004-09-25  HeartRate    65
10   John       2004-09-25  BP-Arterial  64
10   John       2004-09-25  PulseRate    63   
34   Pete       2007-07-21  BP-Arterial  68
34   Pete       2007-07-21  PulseRate    56

我想做两件事,

1) 按 Vitals 分组。 2) 计算在特定日期为每个 ID 测量的生命体征数量 (ID + Date) 并像下面这样折叠并粘贴这些值。

Vitals      Series
HeartRate   2,1,1
BP-Arterial 1,1,1,1
PulseRate   1,1,1 

HeartRate 的“系列”列下的值为 2, 1, 1,因为测量了心率

2001 年 5 月 29 日 ID 10 两次,

2005 年 8 月 15 日 ID 34 一次,

2004 年 9 月 24 日 ID 10 一次

不确定如何使用 dplyr 折叠和粘贴这些值,非常感谢任何帮助。

Count the number of Vitals that were measured for each ID on a specific date (ID + Date)

这意味着您需要按所有三个分组。然后我们可以仅通过 vitals 重新组合以进行最终崩溃:

dat %>% group_by(Vitals, Id, Date) %>%
    summarize(n = n()) %>%
    ungroup() %>%
    group_by(Vitals) %>%
    summarize(Series = paste(n, collapse = ','))
# # A tibble: 3 × 2
#        Vitals  Series
#        <fctr>   <chr>
# 1 BP-Arterial 1,1,1,1
# 2   HeartRate   2,1,1
# 3   PulseRate   1,1,1

使用 dplyrrle 即 运行 长度编码,请参阅 ?rle 了解更多详情

library(dplyr)

newDF = DF %>%
    group_by(Id,Date) %>%
    do(.,data.frame(Series=paste(rle(.$Vitals)$lengths,collapse=","),stringsAsFactors=FALSE)) %>%
    as.data.frame()

newDF
#  Id       Date Series
#1 10 2001-05-29  2,1,1
#2 10 2004-09-25  1,1,1
#3 34 2005-08-15    1,1
#4 34 2007-07-21    1,1