2

タイトルで意図を説明したかどうかはわかりませんが、本質的には改宗したい

        mean    sd
v1  -32.72  0.565
v2  -50.47  1.543
v3  -30.17  0.9295
v4  -38.56  0.4541
g1  5.649   0.02509
g2  1.672   0.02992
g3  3.139   0.03507
g4  7.169   0.06703
y1  271.1   3.48
y2  123.7   1.81
y3  138.9   2.727
y4  405.5   4.396

 v.mean v.sd    g.mean  g.sd    y.mean  y.sd
-32.72  0.565   5.649   0.02509 271.1   3.48
-50.47  1.543   1.672   0.02992 123.7   1.81
-30.17  0.9295  3.139   0.03507 138.9   2.727
-38.56  0.4541  7.169   0.06703 405.5   4.396

forループを使わずにやりたいです。reshapeこれを行う機能があると思います。この構成のデータセットは多数あります。それで、私はいくつかのベクトル化ソリューションが欲しかったのです...また、長さは何でもかまいません。ここで、サンプルデータでは、系列の長さは4です。さらに、列名については気になりません。を使用して達成できることnames(dataframe)=c(...

4

3 に答える 3

5

確かにという名前の関数がありますreshape。data.frameの名前が「data」であるとすると、次のようにして目的の結果を取得します。

data$group <- substr(rownames(data),1,1)
data$id <- substr(rownames(data),2,2)
result <- reshape(data, v.names=c("mean","sd"), idvar="id", timevar="group", direction="wide")

詳細については、を参照してください。?reshape

于 2013-01-03T22:26:05.933 に答える
1

を使用して、巧妙に溶けたデータreshap2を適用します。acast

dat <- read.table(text ='v1  -32.72  0.565
v2  -50.47  1.543
v3  -30.17  0.9295
v4  -38.56  0.4541
g1  5.649   0.02509
g2  1.672   0.02992
g3  3.139   0.03507
g4  7.169   0.06703
y1  271.1   3.48
y2  123.7   1.81
y3  138.9   2.727
y4  405.5   4.396')
colnames(dat) <- c('var','mean','sd')

まず、データを溶かします。

dat.m <- melt(dat)
Using var as id variables
   var variable     value
1   v1     mean -32.72000
2   v2     mean -50.47000
3   v3     mean -30.17000
4   v4     mean -38.56000
5   g1     mean   5.64900

次に、var列を分割して、将来の列でvarの文字だけを使用する必要があります。通常は使用します ColSplitが、ここでは目に見えるパターンがないため、手作業で列を作成して適用しますacast

dat.m$vv <- substr(dat.m$var,1,1)
dat.m$key <- substr(dat.m$var,2,2)
acast(dat.m[,-1],id ~variable+vv)
  mean_g mean_v mean_y    sd_g   sd_v  sd_y
1  5.649 -32.72  271.1 0.02509 0.5650 3.480
2  1.672 -50.47  123.7 0.02992 1.5430 1.810
3  3.139 -30.17  138.9 0.03507 0.9295 2.727
4  7.169 -38.56  405.5 0.06703 0.4541 4.396
于 2013-01-03T22:45:33.923 に答える
1

これは@Theodoreの答えと非常によく似たアプローチです。データセットが「dat」と呼ばれると仮定します。

reshape(cbind(dat, do.call(rbind, strsplit(rownames(dat), ""))), 
        idvar="2", timevar="1", direction = "wide")
#    2 mean.v   sd.v mean.g    sd.g mean.y  sd.y
# v1 1 -32.72 0.5650  5.649 0.02509  271.1 3.480
# v2 2 -50.47 1.5430  1.672 0.02992  123.7 1.810
# v3 3 -30.17 0.9295  3.139 0.03507  138.9 2.727
# v4 4 -38.56 0.4541  7.169 0.06703  405.5 4.396

上記の場合:

  • do.call(rbind, strsplit(rownames(dat), ""))最初の列が文字「v」、「g」、「y」で、2番目の列が1から4の数字である2列の行列を作成します。この手順は、2文字にのみ適用されるため、同様の問題を単純化しすぎますrownames。より複雑なシナリオでは、正規表現に頼らなければならない可能性があります。
  • cbind(...)この新しいマトリックスを元のマトリックスと統合しますdata.frame; 新しい列名は単に「1」と「2」です。
  • 「time」変数は、文字「v」、「g」、および「y」(「2」という名前の列)を含む新しい列です。「id」変数は、1から4までの数字を含む新しい列(「1」という名前の列)です。その情報をreshape()データに使用します。

reshape()その段階にデータを取得した後で関数を使用する代わりに、次を使用することもできaggregate()ます。

aggregate(cbind(mean, sd) ~ `2`, 
          data = cbind(dat, do.call(rbind, strsplit(rownames(dat), ""))), 
          FUN = I)
  2  mean.1  mean.2  mean.3    sd.1    sd.2    sd.3
1 1 -32.720   5.649 271.100 0.56500 0.02509 3.48000
2 2 -50.470   1.672 123.700 1.54300 0.02992 1.81000
3 3 -30.170   3.139 138.900 0.92950 0.03507 2.72700
4 4 -38.560   7.169 405.500 0.45410 0.06703 4.39600
于 2013-01-06T17:15:37.137 に答える