R+;重塑:data.frame中列的变化

R+;重塑:data.frame中列的变化,r,dataframe,reshape,R,Dataframe,Reshape,我在R中使用重塑来计算data.frame列上的聚合统计信息。这是我的data.frame: > df a a b b ID 1 1 1 1 1 1 2 2 3 2 3 2 3 3 5 3 5 3 这只是一个小test data.frame,用于尝试和理解重塑包。我熔化,然后铸造,试图找到as和bs的平均值: > melt(df, id = "ID") -> df.m > cast(df.m, ID ~ variable, fun = mean) ID a

我在R中使用重塑来计算data.frame列上的聚合统计信息。这是我的data.frame:

> df
  a a b b ID
1 1 1 1 1  1
2 2 3 2 3  2
3 3 5 3 5  3
这只是一个小test data.frame,用于尝试和理解重塑包。我熔化,然后铸造,试图找到
a
s和
b
s的平均值:

> melt(df, id = "ID") -> df.m
> cast(df.m, ID ~ variable, fun = mean)
  ID a b
1  1 1 1
2  2 2 2
3  3 3 3
啊!什么?希望
c(2,3)
的平均值为2.5,依此类推。发生什么事?有件事:

> df.m
   ID variable value
1   1        a     1
2   2        a     2
3   3        a     3
4   1        a     1
5   2        a     2
6   3        a     3
7   1        b     1
8   2        b     2
9   3        b     3
10  1        b     1
11  2        b     2
12  3        b     3

发生什么事了?我的
5
s去了哪里?我是否有一个非常基本的误解?如果是:这是什么?

我在这里更新了我的答案来解决这个问题:

显然,如果您的数据帧没有唯一的列名,它们将无法正确地融化

编辑: 显然,要使
melt()
正常工作,您需要具有唯一的列名,而不是
ab
的列名。最低限度地
a.1 a.2 a.3 b.1 b.2
或其他什么。使用
melt()
后,您可以选择在
variable
的级别上使用
gsub()
来消除歧义值,或者使用
colsplit()
来创建两个新列。对于我刚才给出的虚拟名称,它看起来像:

levels(df.m$variable) <- gsub("\\..*", "", levels(df.m$variable))
#or
df.m <- cbind(df.m, colsplit(df.m$variable, split = "\\.", names = c("Measure","N")))

levels(df.m$variable)这不是有效的数据框,因为列没有唯一的名称。

不知道我可以创建无效的数据框。