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
Post a Comment