【发布时间】:2014-01-13 16:38:44
【问题描述】:
tnt <- data.frame( g = rep(letters[1:2], each = 5), x = c(1:5,2:6), y = "things" )
library(plyr)
ddply(tnt, .(g,x), summarise, count = length(y) )
考虑到上面的代码计算每个x 值在每个g 组中的行数:
在a 中表示级别6 和在b 中表示1 的最简单方法是什么?即x 的所有级别代表g 的所有级别。
我的解决方案是在将每个ddply 块的级别重置为1:6 后使用as.data.frame(table(x)),但这似乎很麻烦。
(如果最简单的方法涉及 base,我不会使用 plyr)
编辑
@rrs 的答案很棒 (+1),但是,我的错是在尝试创建一个简单的示例时,我过度简化了问题。有很多分组因素(不仅仅是g),当我尝试.drop = FALSE时,我收到以下错误:
错误:长度(行)== 1 不正确
我认为这可能是因为许多分组因素不会一起发生而且永远不会发生。如何执行以下操作:
c4 <- data.frame( g = rep(letters[1:2], each = 5),
f = c(sample(letters[24:25], 5, replace = TRUE),
sample(letters[25:26], 5, replace = TRUE)),
x = c(1:5,2:6),
y = "things" )
ddply(c4, .(g,f,x), summarise, count = length(y), .drop = FALSE)
但是.drop = FALSE 应该只适用于x 而不是g 和f,即a 中不应该有z。
【问题讨论】:
-
您可能需要在编辑中重新编写示例。当我查看
c4时,我在第 22、24、26、28 和 30 行看到“z”和“a”。 -
感谢@rrs 现在更正它。
-
我在编辑中运行了您的代码,没有“z”和“a”一起出现的行。还有什么问题吗?