0

我正在编写代码来生成有关研究对象及其后续访问时间的报告。我的数据如下所示:

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以便它可以看到四个级别并相应地创建数据框,但这似乎充其量是笨拙的。有没有更好的办法?

4

1 回答 1

2

这是一种以编程方式扩展数据框以添加未填充级别的列的方法:

> new_df <- reshape(data=test_df,
+         timevar="timepoint",idvar="subj_id",direction="wide" )
> new_df
  subj_id date.3 month
1     100   2013-01-01
2     101   2013-01-12
3     102   2013-02-01
> new_df[ ,  setdiff(levels(test_df$timepoint) ,
                       factor(test_df$timepoint)) ] <- NA
> 
> new_df
  subj_id date.3 month 6 month 9 month 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

注意:这些列名总是需要被引用,因为它们有空格。我从不允许列名保持这种状态。

于 2013-07-19T23:41:41.343 回答