r - Better way to use plyr (or other) to create a variable using seq from 2 other variables -


i've got data contains admission , discharge dates, , need (for each person , admit id #), create wide-to-long-ish dataframe contains person , admit id sequence between admit , discharge indicating value every day in between , including admit , discharge.

i've stumbled on hack-ish way of doing takes advantage of how dlply names items in list creates; however, worry might error prone. either way, feels clumsy, , wonder if there cleaner way of doing using less code.

person <- c(1, 2, 3, 3) admit <- c(1, 1, 1, 2) admit.date <- as.date(c("1/1/2010", "1/1/2010", "1/1/2010", "2/1/2010"), "%m/%d/%y") discharge.date <- as.date(c("1/1/2010",  "1/1/2010", "1/1/2010", "2/1/2010"), "%m/%d/%y") + c(1,2,2,2) df1 <- data.frame(person, admit, admit.date, discharge.date) df1 ## start  library(plyr) los_seq <-  function(df) { seq(df$admit.date, df$discharge.date, 1)}  lst1 <- dlply(df1, .(person, admit), los_seq) vec1 <- unlist(lst1) ## gets hackish df2 <- data.frame(v1 = paste(names(vec1), vec1, sep="__")) df2$person <- substr(df2$v1, 1, regexpr("\\.", df2$v1)-1) df2$admit <- substr(df2$v1, regexpr("\\.", df2$v1)+1,  regexpr("\\.", df2$v1)+1) df2$date <- as.date(as.numeric(substr(df2$v1, regexpr("__", df2$v1)+2,  nchar(df2$v1))), origin="1970-01-01") df2[,-1]  ##  how need result 

what using following (since you're using actual dates):

seq <- df1$discharge.date - df1$admit.date + 1 df1[rep(row.names(df1), seq), 1:2] #     person admit # 1        1     1 # 1.1      1     1 # 2        2     1 # 2.1      2     1 # 2.2      2     1 # 3        3     1 # 3.1      3     1 # 3.2      3     1 # 4        3     2 # 4.1      3     2 # 4.2      3     2 

and now, guess might referring in comment, perhaps you're looking sequence of dates.

seq <- df1$discharge.date - df1$admit.date + 1 df2 <- df1[rep(row.names(df1), seq), 1:3] df2$date <- df2$admit.date + sequence(seq)-1 df2[-3] #     person admit       date # 1        1     1 2010-01-01 # 1.1      1     1 2010-01-02 # 2        2     1 2010-01-01 # 2.1      2     1 2010-01-02 # 2.2      2     1 2010-01-03 # 3        3     1 2010-01-01 # 3.1      3     1 2010-01-02 # 3.2      3     1 2010-01-03 # 4        3     2 2010-02-01 # 4.1      3     2 2010-02-02 # 4.2      3     2 2010-02-03 

Comments

Popular posts from this blog

node.js - Bad Request - node js ajax post -

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -