reshape2 - melt - id.vars合并为1列

时间:2014-03-03 13:27:12

标签: r reshape2

我有这样的data.frame组织如下:

   Time.A         Z.A        Y.A    Time.B        Z.B         Y.B
1       1 -0.10612452  0.6359504  1.414806 -0.4304691 -1.71700868
2       2  1.51152200 -0.2842529  2.437075 -0.2572694 -0.78445901
3       3 -0.09465904 -2.6564554  2.786140 -1.7631631 -0.85090759
4       4  2.01842371 -2.4404669  4.330448  0.4600974 -2.41420765
5       5 -0.06271410  1.3201133  5.141746 -0.6399949  0.03612261
6       6  1.30486965 -0.3066386  6.019096  0.4554501  0.20599860
7       7  2.28664539 -1.7813084  7.236588  0.7048373 -0.36105730
8       8 -1.38886070 -0.1719174  7.634667  1.0351035  0.75816324
9       9 -0.27878877  1.2146747  9.156992 -0.6089264 -0.72670483
10     10 -0.13332134  1.8951935 10.205065  0.5049551 -1.36828104

变量名称具有其所属组的名称。我想以这样的方式融合这个data.frame,我有一列时间,然后是每个组(本例中为A和B)和每个变量(Z和Y)的相应值。我想要的输出应该是这样的:

Time   Group   variable value
1        A        Z      -0.10612452
1        A        Y       0.6359504
1.41     B        Z      -0.4304691
1.41     B        Y      -1.71700868

我已经成功融化了它,但我坚持让时间栏独一无二。如您所见,时间值并不完全相同。有解决这个问题的简单方法吗?

到目前为止我的代码:

library(plyr)
library(reshape2)

# generating the data.frame
set.seed(42)

Time.A <- 1:10
Time.B <- 1:10+runif(10, -0.5, 0.5)

Z.A <- rnorm(10)
Y.A <- rnorm(10)
Z.B <- rnorm(10)
Y.B <- rnorm(10)

MyData <- data.frame(Time.A, Z.A, Y.A, Time.B, Z.B, Y.B)


#Tried so far
Time.indexes <- grep(pattern="Time", x=names(MyData))
MeltedData <- melt(MyData, id.vars=Time.indexes)
New.Vars <- ldply(strsplit(as.character(MeltedData$variable), split="[.]"))
names(New.Vars) <- c("variable", "Group")

MeltedData <- cbind(MeltedData[-3], New.Vars)

结果是

   Time.A    Time.B       value variable Group
1       1  1.414806 -0.10612452        Z     A
2       2  2.437075  1.51152200        Z     A
3       3  2.786140 -0.09465904        Z     A
4       4  4.330448  2.01842371        Z     A
5       5  5.141746 -0.06271410        Z     A
6       6  6.019096  1.30486965        Z     A
...

1 个答案:

答案 0 :(得分:2)

您可以将来自“reshape2”的基础R reshapemelt汇集在一起​​,让它们一起工作,而不是像往常那样竞争关注。为此,您需要先添加一个“ID”变量(即,如果我正确理解了您想要的输出)。

根据您的样本数据,这是我采取的方法:

MyData$ID <- sequence(nrow(MyData))
out <- melt(reshape(
  MyData, direction = "long", idvar="ID", timevar = "Group",
  varying = setdiff(names(MyData), "ID"), sep = "."),
            id.vars = c("ID", "Group", "Time"))

这就是它的样子。如果您正在寻找您描述的特定订单,则必须重新排序结果。

head(out)
#   ID Group Time variable       value
# 1  1     A    1        Z -0.10612452
# 2  2     A    2        Z  1.51152200
# 3  3     A    3        Z -0.09465904
# 4  4     A    4        Z  2.01842371
# 5  5     A    5        Z -0.06271410
# 6  6     A    6        Z  1.30486965
tail(out)
#    ID Group      Time variable       value
# 35  5     B  5.141746        Y  0.03612261
# 36  6     B  6.019096        Y  0.20599860
# 37  7     B  7.236588        Y -0.36105730
# 38  8     B  7.634667        Y  0.75816324
# 39  9     B  9.156992        Y -0.72670483
# 40 10     B 10.205065        Y -1.36828104