2010-07-28 117 views
1

我在R中使用reshape来计算data.frame的列上的聚合统计信息。这里是我的data.frame:R +重塑: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 

这仅仅是一个小测试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都去哪了?我在这里有一个非常基本的误解吗?如果是这样的话:它是什么?

回答

1

我更新了我的答案在这里,以解决这个问题: R: aggregate columns of a data.frame

很显然,如果你的数据帧不具有唯一的列名,他们将无法正常融化。

编辑: 而不是列名为a a a b b,显然你需要有唯一的列名称melt()才能正常工作。最小a.1 a.2 a.3 b.1 b.2,或其他。在使用melt()之后,您为variable获取合理级别的选项要么使用gsub(),要么使用variable的级别来消除消歧值,要么使用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"))) 
+0

真是痛苦!感谢您的回应... – 2010-07-28 23:53:53

2

这不是有效的数据框,因为这些列没有唯一的名称。

+0

不知道我可以创建无效的data.frames。 – 2010-07-29 15:13:39

+1

你可以在R中做任何事情;) – hadley 2010-07-29 15:44:33