使用R将数据帧转换为宽表

gre*_*eut 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
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)

42-*_*42- 5

尝试:

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"中获得了一些追随者.