我有一系列每个类别的年度事件计数,多年来没有任何行,其中该类别没有发现事件。我想添加一个专栏,显示每年有多少事件发生在过去三年。
处理此问题的一种方法是在零事故中为所有年份添加空行,然后使用左对齐的四年窗口rollapply()
,但这会扩展我的数据集超出我想要的范围。当然有一种方法可以使用ddply()
和transform
吗?
以下两行代码构建一个虚拟数据集,然后按类别执行简单的plyr
和:
dat <- data.frame(
category=c(rep('A',6), rep('B',6), rep('C',6)),
year=rep(c(2000,2001,2004,2005,2009, 2010),3),
incidents=rpois(18, 3)
)
ddply(dat, .(category) , transform, i_per_c=sum(incidents) )
虽然有效,但它只显示每个类别的总数。
我想要一年的总和。
所以我尝试使用ddply()
语法扩展function()
调用,如下所示:
ddply(dat, .(category) , transform,
function(x) i_per_c=sum(ifelse(x$year >= year - 4 & x$year < year, x$incidents, 0) )
)
这只返回原始数据框,未经修改。
我必须遗漏plyr
语法中的内容,但我不知道它是什么。
谢谢, 马特
答案 0 :(得分:3)
这很难看,但它确实有效。嵌套的ply调用:
ddply(dat, .(category),
function(datc) adply(datc, 1,
function(x) data.frame(run_incidents =
sum(subset(datc, year>(x$year-2) & year<=x$year)$incidents))))
可能有一种稍微更清晰的方法,并且肯定有更快的执行方式。