R 按组计数-移动窗口
比如说,我有一个包含医院就诊的数据集。我的目标是生成一个变量,统计访客在就诊日期之前见过的独特患者的数量。我经常与dplyr的团队合作,但这似乎有点棘手。我想我必须使用group_by、n_distinct和sum或某种移动窗口命令。“目标”变量就是我需要的R 按组计数-移动窗口,r,group-by,dplyr,sum,distinct,R,Group By,Dplyr,Sum,Distinct,比如说,我有一个包含医院就诊的数据集。我的目标是生成一个变量,统计访客在就诊日期之前见过的独特患者的数量。我经常与dplyr的团队合作,但这似乎有点棘手。我想我必须使用group_by、n_distinct和sum或某种移动窗口命令。“目标”变量就是我需要的 visitor visitdt patient goal 125469 1/12/2018 15200 1 125469 1/19/2018 15200 1 125469 2/16/2018 15200 1 1
visitor visitdt patient goal
125469 1/12/2018 15200 1
125469 1/19/2018 15200 1
125469 2/16/2018 15200 1
125469 2/23/2018 52607 2
125469 3/9/2018 52607 2
125469 3/16/2018 52607 2
125469 3/23/2018 15200 2
125469 3/29/2018 15200 2
125469 3/30/2018 20589 3
125469 4/6/2018 20589 3
谢谢,
马文您可以:
with(df, ave(patient, visitor, FUN = function(x) cumsum(!duplicated(x))))
[1] 1 1 1 2 2 2 2 2 3 3
本质上,它是每组非重复值的累积和
您也可以对dplyr执行相同的操作:
df %>%
group_by(visitor) %>%
mutate(res = cumsum(!duplicated(patient)))
我们可以使用
dplyr
library(dplyr)
df1 %>%
group_by(visitor) %>%
mutate(goal = cummax(match(patient, unique(patient))))
#or with factor
# mutate(goal1 = cummax(as.integer(factor(patient, levels = unique(patient)))))
# A tibble: 10 x 4
# Groups: visitor [1]
# visitor visitdt patient goal
# <int> <chr> <int> <int>
# 1 125469 1/12/2018 15200 1
# 2 125469 1/19/2018 15200 1
# 3 125469 2/16/2018 15200 1
# 4 125469 2/23/2018 52607 2
# 5 125469 3/9/2018 52607 2
# 6 125469 3/16/2018 52607 2
# 7 125469 3/23/2018 15200 2
# 8 125469 3/29/2018 15200 2
# 9 125469 3/30/2018 20589 3
#10 125469 4/6/2018 20589 3
库(dplyr)
df1%>%
组员(访客)%>%
突变(目标=最大值(匹配(患者、唯一(患者)))
#还是有因素
#突变(goal1=cummax(作为整数)(因子(患者,级别=唯一(患者‘‘)’))
#一个tibble:10x4
#组别:访客[1]
#访客访问患者目标
#
# 1 125469 1/12/2018 15200 1
# 2 125469 1/19/2018 15200 1
# 3 125469 2/16/2018 15200 1
# 4 125469 2/23/2018 52607 2
# 5 125469 3/9/2018 52607 2
# 6 125469 3/16/2018 52607 2
# 7 125469 3/23/2018 15200 2
# 8 125469 3/29/2018 15200 2
# 9 125469 3/30/2018 20589 3
#10 125469 4/6/2018 20589 3
数据
df1听起来对你跟踪的内容很重要。另一个使用数据的选项。表使用非等联接,然后通过引用更新:
DT[, goal2 :=
DT[.SD, on=.(visitor, visitdt<=visitdt), allow.cartesian=TRUE,
length(unique(patient)), by=.EACHI]$V1]
数据:
库(data.table)
非常感谢你!这太棒了!R几乎可以做任何事情!非常感谢你!这太棒了!
DT[, goal2 :=
DT[.SD, on=.(visitor, visitdt<=visitdt), allow.cartesian=TRUE,
length(unique(patient)), by=.EACHI]$V1]
visitor visitdt patient goal goal2
1: 125469 2018-01-12 15200 1 1
2: 125469 2018-01-19 15200 1 1
3: 125469 2018-02-16 15200 1 1
4: 125469 2018-02-23 52607 2 2
5: 125469 2018-03-09 52607 2 2
6: 125469 2018-03-16 52607 2 2
7: 125469 2018-03-23 15200 2 2
8: 125469 2018-03-29 15200 2 2
9: 125469 2018-03-30 20589 3 3
10: 125469 2018-04-06 20589 3 3
library(data.table)
DT <- fread("visitor visitdt patient goal
125469 1/12/2018 15200 1
125469 1/19/2018 15200 1
125469 2/16/2018 15200 1
125469 2/23/2018 52607 2
125469 3/9/2018 52607 2
125469 3/16/2018 52607 2
125469 3/23/2018 15200 2
125469 3/29/2018 15200 2
125469 3/30/2018 20589 3
125469 4/6/2018 20589 3")
DT[, visitdt := as.Date(visitdt, "%m/%d/%Y")]