R ddply:如何在结果中包含字符向量

R ddply:如何在结果中包含字符向量,r,plyr,R,Plyr,抱歉,对于这个神秘的标题,我没有找到更好的问题摘要。因此,我的问题是:我有一个数据帧,希望在组上设置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

抱歉,对于这个神秘的标题,我没有找到更好的问题摘要。因此,我的问题是:我有一个数据帧,希望在组上设置
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))
但这会产生错误信息:

length(rows) == 1 is not TRUE
我猜这是因为索引有更多的行,因为它不是由
diff
处理的。我的问题有快速的解决办法吗

多谢各位

编辑

我试图澄清我的问题,我想为结果添加什么:

假设上面的变量
索引
。这是一个应该解释某些事情的因素。但是,我不能接受它的
diff()
,因为它没有任何意义,所以我只想通过这个,而不做任何更改。我尝试了
drop==FALSE
,但确实产生了相同的错误消息

为所有这些混乱感到悲哀!下面是一个非常简单的示例:

name year  index  value
 a   2008    c1    10
 a   2009    c2    30
 a   2010    c1    40
在接受diff的Acros group“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()


我真的希望这能给你一个我想要的线索——如果不是,我会删除这个问题,因为我发现了一个不合法的解决方法;)对于给您带来的不便,我深表歉意

我不完全确定您想要什么,听起来好像您想要获得差异,保留索引变量并删除每个分组的第一行。这能满足你的需要吗

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)

你想让他们怎么排队?Head默认返回前六个元素。我想我没有理解从另一个答案复制的
Head()
部分的含义。我基本上想通过一个与姓名和年份严格相关但频率更高的索引。我要澄清我的问题!您希望索引是什么样子的。ddply中的一个子集有4行,diff有三个值,前两个有索引c1,后两个有索引c2。什么样的索引值会属于那个?“c1-c2”@BrandonBertelsen将索引视为另一组,因此将
diff()
函数分成三组而不是两组-对吗?但这不是我所需要的——或者我不只是得到逻辑吗?在
名称
/
年份
组中,
索引
是否总是相同的?如果是这样,Brandon的解决方案会起作用,因为添加第三个分组变量不会改变组。如果没有,那么就存在识别哪个
索引
应该与哪个
差异
-ed值匹配的问题,特别是因为
diff
-ed值比
index
值少一个。这花了一些时间,直到有人能够破译我的神秘解释,但看起来这是我试图达到的结果!谢谢!
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)