逆转dcast

3

这个想法是将频率表转换成可被 ggplot2 的 geom_density 函数处理的形式。

从一个频率表开始。

> dat <- data.frame(x = c("a", "a", "b", "b", "b"), y = c("c", "c", "d", "d", "d"))
> dat
  x y
1 a c
2 a c
3 b d
4 b d
5 b d

使用dcast制作频率表
> library(reshape2)
> dat2 <- dcast(dat, x + y ~ ., fun.aggregate = length)
> dat2
  x y count
1 a c     2
2 b d     3

这个怎么能反过来呢?melt 似乎不是答案:
> colnames(dat2) <- c("x", "y", "count")
> melt(dat2, measure.vars = "count")
  x y variable value
1 a c    count     2
2 b d    count     3
1个回答

0

由于您可以使用任何聚合函数,因此如果不知道如何反转聚合,则无法反转 dcast(聚合)。

对于 length,明显的反向操作是 rep。 对于像 summean 这样的聚合,没有明显的反向操作(假设您没有将原始数据保存为属性)

一些反转 length 的选项

您可以使用 ddply

library(plyr)
ddply(dat2,.(x), summarize, y = rep(y,count))

或者更简单地说

as.data.frame(lapply(dat2[c('x','y')], rep, dat2$count))

dat2[rep(row.names(dat2), dat2$count), 1:2]是什么意思? - A5C1D2H2I1M1N2O1R2T1
如果你把那个评论变成回答,我会接受它。在 R 中,总是有更难的方法去做一件事情,不是吗? - nacnudus
@mnel,这两个对我都不起作用。如果我错过了一些基本的东西,请原谅,但第一个错误是Error in NextMethod() : cannot coerce type 'closure' to vector of type 'integer',另一个错误是Error in rep.default(X[[1L]], ...) : invalid 'times' argument。Rep确实是显而易见的解决方案,但它似乎并不擅长复制整行数据框。 - nacnudus
@nacnudus,他们正在处理您的示例。 - mnel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接