我有以下数据框:
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)
我有以下数据框:
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)
尝试:
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 包的方法具有更一致的语法。查看dcast
plyr 中的函数。base-R中也有该reshape
功能,并在 SO 中搜索工作示例。如果您开始需要速度,该data.table
软件包值得一看。它的语法与 plyr 不同,需要进行一些心理调整,但它在“高级用户”中获得了追随者。