0

我有以下数据框:

    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)
4

1 回答 1

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

对于这种“长”到“宽”的转换,还有很多其他方法可能会起作用。plyr 包的方法具有更一致的语法。查看dcastplyr 中的函数。base-R中也有该reshape功能,并在 SO 中搜索工作示例。如果您开始需要速度,该data.table软件包值得一看。它的语法与 plyr 不同,需要进行一些心理调整,但它在“高级用户”中获得了追随者。

于 2012-11-29T18:36:41.003 回答