我有这样的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
...
答案 0 :(得分:2)
您可以将来自“reshape2”的基础R reshape
和melt
汇集在一起,让它们一起工作,而不是像往常那样竞争关注。为此,您需要先添加一个“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