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は 4 つのレベル (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ますか? 私の現在の考えは、実行する前に4つの「偽の」レコードを入れて、reshape4つのレベルを見てそれに応じてデータフレームを作成することですが、それはせいぜい不器用に思えます。より良い方法はありますか?

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 に答える