我有以下数据框:
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
Run Code Online (Sandbox Code Playgroud)
我想把它变成:
s0 s1 s2
A 2.5 1 3
B 5.6 7 0
C 8 0 0
Run Code Online (Sandbox Code Playgroud)
这样它就可以用了chisq.test.
我尝试过以下内容,只考虑事件但不考虑值:
table(d$T, d$S)
Run Code Online (Sandbox Code Playgroud)
尝试:
xtabs(V ~ S + T, data=d) #
Run Code Online (Sandbox Code Playgroud)
实际上你正在扩展列联表的定义,但只要没有重复的级别,我就没有小数值的问题.如果你有可能需要使用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
Run Code Online (Sandbox Code Playgroud)
还有很多其他方法可能适用于这种"长期"到"广泛"的转型.plyr包为它的方法提供了更一致的语法.看看dcastplyr 中的函数.reshapebase-R中还有函数,搜索SO以获取工作示例.data.table如果你开始需要速度,这个包应该值得一看.它有一个不同于plyr的语法,需要一点心理调整,但它在"power useRs"中获得了一些追随者.