0

入院日と退院日を含むデータがいくつかあります。(各人および入院 ID 番号ごとに)、入院と退院の間のシーケンスで人を含む幅広から長さのデータフレームを作成し、ID を許可する必要があります。入院と退院を含むその間の毎日の値を示します。

dlply が作成するリスト内の項目に名前を付ける方法を利用して、これを行う非常にハック的な方法に出くわしました。ただし、エラーが発生しやすいのではないかと心配しています。いずれにせよ、これはぎこちなく感じます。より少ないコードでこれを行うためのよりクリーンな方法があるのではないかと思います。

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 ## where I 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)
## now it gets really 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]  ##  this is how I need the result to look
4

1 に答える 1

2

次のようなものを使用するのはどうですか (実際の日付を使用しているため):

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

そして今、あなたのコメントで何を参照しているのかを推測するために、おそらくあなたは一連の日付も探しているでしょう.

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
于 2013-04-19T07:32:15.153 に答える