2012-11-29 112 views
0

这里是一个很小的问题。我这有以下数据帧:将数据框转换为宽表R

T S V 
1 s0 A 2.5 
2 s1 A 1 
3 s2 A 3 
4 s0 B 5.6 
5 s1 B 7 
6 s0 C 8 

而且我想将它变成:

s0 s1 s2 
A 2.5 1 3 
B 5.6 7 0 
C 8 0 0 

因此,它可以通过一个chisq.test使用。

我已经试过这一点,但只考虑的发生,但不是值:

table(d$T, d$S) 

感谢,

回答

5

尝试:

xtabs(V ~ S + T, data=d) # 

你实际上是拉伸应变表的定义有点不过,只要没有重复的级别,我没有小数值的问题。如果您有可能需要使用tapply以及适当的聚合函数,并且如果您想要缺少的因子水平中的零,则可以使用“正确”或“归零”NA。

> td <- tapply(d$V, list(d$S, d$T), sum) 
> td[is.na(td) ] <- 0 
> td 
    s0 s1 s2 
A 2.5 1 3 
B 5.6 7 0 
C 8.0 0 0 

有相当可能对这个“长”到“宽” transformaltion工作没其他方法。 plyr软件包的方法语法更一致。看看plyr中的dcast函数。在base-R中还有reshape函数,搜索SO中有工作示例。如果你开始需要速度,data.table包值得一看。它与plyr有不同的语法,需要一点心理调整,但在“使用功率R”中获得了一个跟随。