1

reshape2R のパッケージに関するドキュメントや、ワイド フォーマットからロング フォーマットへ、またはその逆にデータを再構築するための他のパッケージを読んでいます。ただし、時間の新しい変数を作成し、ホルモン測定値を時間ごとにグループ化する必要があるため、この問題に行き詰まっています。R以前は SPSS でこれを行っていましたが、他の多くの理由と同様に明らかな理由で SPSS に切り替えています。でこれを行う簡単な方法があるに違いないことは知っていますが、これRを理解するのに苦労しています。

このプロジェクトのデータは、各患者について 5 つの異なる時点で 20 の異なるホルモンが測定された縦断的臨床研究からのものです (作成されたデータの例を以下に示します - a1 は来院 1 時のホルモン「a」、a2 はホルモン「a」です)。 ' 訪問 2 など)。研究には合計 20 人の患者がおり、それぞれがスプレッドシートに一意の識別子 (id) を持っています。ホルモン データ (ホルモン 'a'、ホルモン 'b' など) は、私のスプレッドシートでは次のように広い形式で配置されています。

> id     a1     a2     a3     a4     a5    b1     b2     b3     b4     b5...
>  1     21     50     28     19     15    24     90     40     35     20...
>  2     23     45     15     22     20    25     45     34     31     22...
>  3     29     88     33     32     21    78     32     33     45     21...
...

以前に SPSS でこれを行ったとき、ソフトウェアは id 変数と縦方向の測定値を折りたたむための変数名を求めてきました。「訪問」と呼ばれる 1 から 5 までの新しい変数を作成します。これは、各ホルモンに関する 5 つの測定値に対応します。SPSS でこれを行うと、次のような長い形式で新しい出力が作成されます。

> id     visit      a     b
> 1          1     21    24
> 1          2     50    90
> 1          3     28    40
> 1          4     19    35
> 1          5     15    20
> 2          1     23    25
> 2          2     45    45
> 2          3     15    34
> 2          4     22    31
> 2          5     20    22
> 3          1     29    78
...

reshape を使用してみましたが、関数は機能しているように見えますが、実際のデータを見ると、ワイド フォーマットとロング フォーマットの間で数値が混同されています。私は非常に基本的な間違ったことをしているに違いありませんが、それを理解するのに苦労しています。

d_long <- reshape(d, varying = c("a1", "a2", "a3", "a4", "a5", 
    "b1", "b2", "b3", "b4", "b5"), v.names = c("a", "b"), 
    idvar = "id", times = c(1:5), direction = "long")
4

4 に答える 4

0

ロング フォーマットとワイド フォーマットの間でデータを変換する方法の概要を以下に示します。

R と SAS を使用して、データ形式を変更します: ロングからワイド、ワイドからロング

于 2015-08-18T18:03:56.210 に答える
0

reshape() 関数を使用し、引数 timevar で新しい時間変数を指定する必要があると思います。

于 2015-08-18T16:13:33.503 に答える
0

meltこれは、開発バージョンの で簡単に実行できますdata.table。devel 版のインストール手順はhere.

「data.frame」を「data.table」に変換します ( setDT(df1))。次に、patternsmeasure引数にを指定して、複数の列meltに一致させます。measure

library(data.table)
dM <- melt(setDT(df1), measure=patterns(c('^a\\d+', '^b\\d+')),
          value.name=c('a', 'b'), variable.name='visit')[order(id)]
dM
#    id visit  a  b
# 1:  1     1 21 24
# 2:  1     2 50 90
# 3:  1     3 28 40
# 4:  1     4 19 35
# 5:  1     5 15 20
# 6:  2     1 23 25
# 7:  2     2 45 45
# 8:  2     3 15 34
# 9:  2     4 22 31
#10:  2     5 20 22
#11:  3     1 29 78
#12:  3     2 88 32
#13:  3     3 33 33
#14:  3     4 32 45
#15:  3     5 21 21

データ

df1 <- structure(list(id = 1:3, a1 = c(21L, 23L, 29L), a2 = c(50L, 45L, 
88L), a3 = c(28L, 15L, 33L), a4 = c(19L, 22L, 32L), a5 = c(15L, 
20L, 21L), b1 = c(24L, 25L, 78L), b2 = c(90L, 45L, 32L), b3 = c(40L, 
34L, 33L), b4 = c(35L, 31L, 45L), b5 = c(20L, 22L, 21L)), .Names = c("id", 
"a1", "a2", "a3", "a4", "a5", "b1", "b2", "b3", "b4", "b5"),
class = "data.frame", row.names = c(NA, -3L))
于 2015-08-18T16:38:51.760 に答える
0

ベース R のリシェイプを使用する:

res <- reshape(df1, direction = "long", varying = list(2:6, 7:11), idvar = "id",
               v.names = c("a", "b"), timevar = "visit")
res[order(res$id),]

与えます:

    id visit  a  b
1.1  1     1 21 24
1.2  1     2 50 90
1.3  1     3 28 40
1.4  1     4 19 35
1.5  1     5 15 20
2.1  2     1 23 25
2.2  2     2 45 45
2.3  2     3 15 34
2.4  2     4 22 31
2.5  2     5 20 22
3.1  3     1 29 78
3.2  3     2 88 32
3.3  3     3 33 33
3.4  3     4 32 45
3.5  3     5 21 21
于 2015-08-19T00:12:13.780 に答える