i'm trying consecutive counts noshow column grouped patientid column. below code using close results wish attain. however, using sum function returns sum of whole group. sum function sum current row , rows have '1' above it. basically, i'm trying count consecutive amount of times patient noshows appointment each row , reset 0 when show. seems tweaks need made below code. however, cannot seem find answer anywhere on site.
transform(df, consecnoshows = ifelse(noshow == 0, 0, ave(noshow, patientid, fun = sum))) the above code produces below output:
#source: local data frame [12 x 3] #groups: id [2] # # patientid noshow consecnoshows # <int> <int> <int> #1 1 0 0 #2 1 1 4 #3 1 0 0 #4 1 1 4 #5 1 1 4 #6 1 1 4 #7 2 0 0 #8 2 0 0 #9 2 1 3 #10 2 1 3 #11 2 0 0 #12 2 1 3 this desire:
#source: local data frame [12 x 3] #groups: id [2] # # patientid noshow consecnoshows # <int> <int> <int> #1 1 0 0 #2 1 1 0 #3 1 0 1 #4 1 1 0 #5 1 1 1 #6 1 1 2 #7 2 0 0 #8 2 0 0 #9 2 1 0 #10 2 1 1 #11 2 0 2 #12 2 1 0 [update] consecutive count offset 1 row down.
thank can offer in advance!
and here's (similar) data.table approach
library(data.table) setdt(df)[, consecnoshows := seq(.n) * noshow, = .(patientid, rleid(noshow))] df # patientid noshow consecnoshows # 1: 1 0 0 # 2: 1 1 1 # 3: 1 0 0 # 4: 1 1 1 # 5: 1 1 2 # 6: 1 1 3 # 7: 2 0 0 # 8: 2 0 0 # 9: 2 1 1 # 10: 2 1 2 # 11: 2 0 0 # 12: 2 1 1 this groups patientid , "run-length-encoding" of noshow , creates sequences using group sizes while multiplying noshow in order keep values when noshow == 1
Comments
Post a Comment