0

私はこのようなデータセットを持っています:

structure(list(var1 = c("APE", "APE", "APE", "APE", "APE", "APE", "GIT",
"APE", "APE", "APE", "APE", "APE", "APE", "APE", "GIT"), var2 = c("AVVAL",
"AULASU", "APALA", "AEA", "ATUPVA", "ASATAP", "ADLO", "AKOKU", "AVVAL",
"AULASU", "APALA", "AEA", "ATUPVA", "ASATAP", "ADLO"), var3 = c(NA,
NA, 1L, 101L, 17122009L, 1L, NA, 684L, NA, NA, 1L, 10L, 17122L,
1L, NA)), .Names = c("var1", "var2", "var3"), row.names = c(NA,
15L), class = "data.frame")

このデータをワイドフォーマットに再形成するにはどうすればよいですか?私はこれを試しました

reshape(h, idvar="var2", v.names="var3", timevar="var1", direction="wide")

しかし、それは私に正しい結果を与えていません。正しい結果は次のとおりです。

  var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
1  APE  NaN 101   NA      1      1 17122009     NA    NA
2  APE  NaN  10   684     1      1    17122     NA    NA
3  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
4  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
4

2 に答える 2

3

編集済み

期待どおりの結果を得る唯一の方法は、data.frame に新しい列を追加することです。データに含まれていない、データに関する暗黙の情報があるように思えます。つまり、特定のレコードが一緒に属するものとして識別する何らかのグループ化変数が必要です。

この情報が何であるかを二重に推測することはできないので、私の回答では、出現するたびGITにレコードの終わりを示すと仮定します。

x <- grep("GIT", h$var1)
h$rec <- rep(seq_along(x), times=c(x[1], diff(x)))

library(reshape2)
mh <- melt(h, measure.vars="var3")
cast(mh, rec+var1~var2, id.var="rec", measure.var="value", fun.aggregate=mean)

  rec var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
1   1  APE  NaN  10   NaN     1      1 17122009     NA    NA
2   1  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
3   2  APE  NaN  10   684     1      1 17122009     NA    NA
4   2  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   Na

元の答え

組み込み関数よりもパッケージreshape2の方がはるかに理解しやすいと思います。reshapeこのパッケージは、次の 2 つの機能を提供します。

  • melt広くdata.frame高くする
  • cast背を高くdata.frameする

あなたの場合、必要なものcast

library(reshape2)
cast(h, var1~var2, value="var3", fun.aggregate=mean)

  var1 ADLO AEA AKOKU APALA ASATAP   ATUPVA AULASU AVVAL
1  APE  NaN  10   684     1      1 17122009     NA    NA
2  GIT   NA NaN   NaN   NaN    NaN      NaN    NaN   NaN
于 2011-10-17T10:00:48.950 に答える