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函数更容易理解。这个包提供了两个功能:

  • 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 回答
0

由于以下含义,我添加了一个新变量GIT

 dat$id <- cumsum(dat$var1=='GIT')

首先我进行聚合:

datMean <- aggregate(var3 ~ var2 * id, data=dat, FUN=mean)

> datMean
    var2 id     var3
1    AEA  0      101
2  APALA  0        1
3 ASATAP  0        1
4 ATUPVA  0 17122009
5    AEA  1       10
6  AKOKU  1      684
7  APALA  1        1
8 ASATAP  1        1
9 ATUPVA  1    17122

然后从长到宽的转换:

datWide <- reshape(datMean, direction='wide', idvar='id', timevar='var2')

> datWide
  id var3.AEA var3.APALA var3.ASATAP var3.ATUPVA var3.AKOKU
1  0      101          1           1    17122009         NA
5  1       10          1           1       17122        684
于 2011-10-17T12:20:26.113 回答