1

私は複数レベルの構造を持っており、私がする必要があるのは、各個人 (より高いレベルのユニットであり、それぞれがいくつかの個別の対策を持っている) を標準化することです。

検討:

  ID measure score
1  1       1     5
2  1       2     7
3  1       3     3
4  2       1    10
5  2       2     5
6  2       3     3
7  3       1     4
8  3       2     1
9  3       3     1

以前apply(data, 2, scale)はすべての人に標準化していました (これは ID とメジャーも標準化しますが、それで問題ありません)。

ID == 1ただし、 、 、ID == 2および を個別に標準化するにはどうすればよいID == 3ですか? --> 各observation-mean of 3 scoresを で割ったものstandard deviation for 3 scores)。

私はforループを考えていましたが、問題はこれをブートストラップしたいということです (つまり、大きなデータセットに対して手順全体を 1000 回複製するため、速度が非常に重要です)。

追加情報: ID はさまざまな測定値を持つことができるため、すべての ID に 3 つの測定スコアがあるわけではありません。

dputデータのは次のとおりです。

structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), measure = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), score = c(5L, 7L, 3L, 10L, 5L, 
3L, 4L, 1L, 1L)), .Names = c("ID", "measure", "score"), class = "data.frame", row.names = c(NA, 
-9L))
4

1 に答える 1

3

ここにlapplywithsplitソリューションがあり、データがDF

> lapply(split(DF[,-1], DF[,1]), function(x) apply(x, 2, scale))
$`1`
     measure score
[1,]      -1     0
[2,]       0     1
[3,]       1    -1

$`2`
     measure      score
[1,]      -1  1.1094004
[2,]       0 -0.2773501
[3,]       1 -0.8320503

$`3`
     measure      score
[1,]      -1  1.1547005
[2,]       0 -0.5773503
[3,]       1 -0.5773503

同じ結果を生成する別の方法は次のとおりです。

> simplify2array(lapply(split(DF[,-1], DF[,1]), scale))

applyこの代替手段は、内部lapply呼び出しの使用を回避します。

ここでsplitは、データを で定義されたグループに分割しID、リストを返すため、 をlapply適用してリストの各要素をループするために使用できますscale

ddply@Rolandが示唆するようにfrom plyrを使用する:

> library(plyr)
> ddply(DF, .(ID), numcolwise(scale))
  ID measure      score
1  1      -1  0.0000000
2  1       0  1.0000000
3  1       1 -1.0000000
4  2      -1  1.1094004
5  2       0 -0.2773501
6  2       1 -0.8320503
7  3      -1  1.1547005
8  3       0 -0.5773503
9  3       1 -0.5773503

データのインポート (これは最後のコメントへの回答です)

DF <- read.table(text="  ID measure score
1  1       1     5
2  1       2     7
3  1       3     3
4  2       1    10
5  2       2     5
6  2       3     3
7  3       1     4
8  3       2     1
9  3       3     1", header=TRUE)
于 2013-04-15T11:14:56.533 に答える