diff()
:
df <- data.frame (name = rep(c("a", "b", "c"), 4),
index = rep(c("c1", "c2"), each=6),
year = rep(c(2008:2010),4),
value = rep(1:3, each=4))
head(df)
name index year value
1 a c1 2008 1
2 b c1 2009 1
3 c c1 2010 1
ddply(df, .(name, year), summarize, value=diff(value))
但是,我想在我尝试使用的结果中加入index
:
ddply(df, .(name, year), summarize, value=diff(value), index=index)
然而,这会产生错误消息:
length(rows) == 1 is not TRUE
我猜是因为索引有更多行,因为它不由diff
处理。我的问题有快速解决方案吗?
非常感谢!
修改
我试着澄清我想要添加到结果中的问题:
假设上面的变量index
。这是一个应该解释的因素。然而,我不能把diff()
的那个没有意义的东西拿走,所以我只想通过这个而不改变任何东西。我试过drop==FALSE
确实产生了相同的错误消息。
Sorr因为这一切混乱!这是一个非常简单的例子:
name year index value
a 2008 c1 10
a 2009 c2 30
a 2010 c1 40
在服用diff的acroos组'a'之后,这看起来像:
name year index d.value
a 2009 c2 +20 #c2 stayed the same just the first row got intentionally dropped.
a 2010 c1 +10
将不幸的名称index
视为属性:它可以在这些年中发生变化但是没有意义采取diff()
我真的希望这能为你提供我想要的线索 - 如果不是,我会删除这个问题,因为我发现了一个不合理的解决方法;)并为所有的不便表示歉意!
答案 0 :(得分:2)
我不完全确定你想要什么,听起来你想要获得差异,保持索引变量并删除每个分组的第一行。这会得到你想要的吗?
doSummary = function(df) {
values = diff(df$value)
indexes = df$index[2:length(df)]
data.frame(d.value=values, index=indexes)
}
ddply(df, .(name, year), doSummary)