4

一个非常简单的问题,但我找不到解决方案:我有一个类似的 data.frame

V1 <- c("A","A","B","B","C","C")
V2 <- c("D","D","E","E","F","F")
V3 <- c(10:15)
df <- data.frame(cbind(V1,V2,V3))

IE

V1 V2 V3
A  D  10
A  D  11
B  E  12
B  E  13
C  F  14
C  F  15

我想

V1 V2 V3.1 V3.2
A  D   10   11
B  E   12   13
C  F   14   15

我尝试 reshape{stats} 和 reshape2

4

2 回答 2

4

正如我所提到的,你所需要的只是一个“时间”变量,你应该没问题。

Mark Miller 展示了基本 R 方法,并手动创建了时间变量。

这是一种自动创建时间变量的方法,以及dcast“reshape2”包中的等效命令:

## Creating the "time" variable. This does not depend
##  on the rows being in a particular order before
##  assigning the variables
df <- within(df, {
  A <- do.call(paste, df[1:2])
  time <- ave(A, A, FUN = seq_along)
  rm(A)
})

## This is the "reshaping" step
library(reshape2)
dcast(df, V1 + V2 ~ time, value.var = "V3")
#   V1 V2  1  2
# 1  A  D 10 11
# 2  B  E 12 13
# 3  C  F 14 15

自我推销提醒

由于这种类型的问题已经出现了好几次,并且由于许多数据集并不总是具有唯一的 ID,因此我已经实现了上述的一个变体,作为getanID我的“splitstackshape”包中调用的函数。在其当前版本中,它将“时间”变量的名称硬编码为“.id”。如果您使用它,步骤将是:

library(splitstackshape)
library(reshape2)
df <- getanID(df, id.vars=c("V1", "V2"))
dcast(df, V1 + V2 ~ .id, value.var = "V3")
于 2013-09-08T18:59:59.250 回答
3
V1 <- c("A","A","B","B","C","C")
V2 <- c("D","D","E","E","F","F")
V3 <- c(10:15)
time <- rep(c(1,2), 3)
df <- data.frame(V1,V2,V3,time)
df

reshape(df, idvar = c('V1','V2'), timevar='time', direction = 'wide')

  V1 V2 V3.1 V3.2
1  A  D   10   11
3  B  E   12   13
5  C  F   14   15
于 2013-09-08T18:46:56.307 回答