Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按组计数-移动窗口_R_Group By_Dplyr_Sum_Distinct - Fatal编程技术网

R 按组计数-移动窗口

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

比如说,我有一个包含医院就诊的数据集。我的目标是生成一个变量,统计访客在就诊日期之前见过的独特患者的数量。我经常与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
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")]