我正在编写代码来生成有关研究对象及其后续访问时间的报告。我的数据如下所示:
subj_id timepoint date
100 3 month 2013-01-01
101 3 month 2013-01-12
102 3 month 2013-02-01
... ... ...
我想把它变成一个“宽”的数据框,然后我可以合并到另一个我拥有的数据框,它显示了何时应该看到该主题。使用reshape
,我可以做到这一点,但我遇到了以下问题:如果我重塑数据框,我只会得到与在变量中找到实际变量一样多的列timepoint
,即使存在尚未遇到的可能值数据库。
因此,在我的示例中,变量timepoint
是具有四个级别的因子:3 个月、6 个月、9 个月和 12 个月。然而,在研究的这一点上,我们还没有任何人超过 3 个月的访问,所以数据只是上面的第 100、101 和 102 行。
使用以下命令,您可以得到我所看到的(显然这不是我的数据的创建方式):
test_df <- data.frame(subj_id=c(100,101,102),
timepoint=c("3 month","3 month","3 month"),
date=c(as.Date("2013-01-01"),
as.Date("2013-01-12"),
as.Date("2013-02-01")))
test_df$timepoint <- factor(x=test_df$timepoint,
levels=c("3 month","6 month",
"9 month","12 month"),
labels=c("3 month","6 month",
"9 month","12 month"),
ordered=TRUE)
print(test_df)
> subj_id timepoint date
> 1 100 3 month 2013-01-01
> 2 101 3 month 2013-01-12
> 3 102 3 month 2013-02-01
levels(test_df$timepoint)
> [1] "3 month" "6 month" "9 month" "12 month"
reshape(data=test_df,v.names="date",
timevar="timepoint",idvar="subj_id",direction="wide")
> subj_id date.3 month
> 1 100 2013-01-01
> 2 101 2013-01-12
> 3 102 2013-02-01
我想得到的是这样的:
> subj_id date.3 month date.6 month date.9 month date.12 month
> 1 100 2013-01-01 NA NA NA
> 2 101 2013-01-12 NA NA NA
> 3 102 2013-02-01 NA NA NA
有没有办法在 base 中做到这一点reshape
?我目前的想法是在我运行之前放入四个“假”记录,reshape
以便它可以看到四个级别并相应地创建数据框,但这似乎充其量是笨拙的。有没有更好的办法?