R:各种组的“差异”功能

时间:2014-07-04 07:45:49

标签: r diff plyr

在搜索我的问题的解决方案时,我找到了这个帖子:Function "diff" over various groups in R。我有一个非常相似的问题,所以我只是在那里使用这个例子。

这是我想要的输出应该是这样的:

name class year diff
1    a    c1   2009  NA      
2    a    c1   2010   67
3    b    c1   2009  NA
4    b    c1   2010   20

我有两个形成子组的变量 - 类和名称。所以我想只比较具有相同名称和类的值。我也希望从2009年到2010年有差异。如果没有2008年,差异2009应该返回NA(因为它无法计算差异)。

我确定它与其他主题的工作方式非常相似,但我无法使其正常工作。我也使用了这个代码(并且通过不同地对数据进行排序来简单地解决了上升年份),但不知何故R仍然设法计算差异并且不返回NA。

ddply(df, .(class, name), summarize, year=head(year, -1), value=diff(value))

2 个答案:

答案 0 :(得分:2)

从另一篇文章中使用数据集,我会做类似

的事情
library(data.table)
df <- df[df$year != 2008, ]
setkey(setDT(df), class, name, year)
df[, diff := lapply(.SD, function(x) c(NA, diff(x))), 
              .SDcols = "value", by = list(class, name)]

返回

df
#    name class year value diff
# 1:    a    c1 2009    33   NA
# 2:    a    c1 2010   100   67
# 3:    b    c1 2009    80   NA
# 4:    b    c1 2010    90   10
# 5:    a    c2 2009    80   NA
# 6:    a    c2 2010    90   10
# 7:    b    c2 2009    90   NA
# 8:    b    c2 2010   100   10
# 9:    a    c3 2009    90   NA
#10:    a    c3 2010   100   10
#11:    b    c3 2009    80   NA
#12:    b    c3 2010    99   19

答案 1 :(得分:2)

使用dplyr

  df %>% 
  filter(year!=2008)%>% 
  arrange(name, class, year)%>%
  group_by(class, name)%>%
  mutate(diff=c(NA,diff(value)))
  # Source: local data frame [12 x 5]
  #  Groups: class, name

  #     name class year value diff
  #  1     a    c1 2009    33   NA
  #  2     a    c1 2010   100   67
  #  3     a    c2 2009    80   NA
  #  4     a    c2 2010    90   10
  #  5     a    c3 2009    90   NA
  #  6     a    c3 2010   100   10
  #  7     b    c1 2009    80   NA
  #  8     b    c1 2010    90   10
  #  9     b    c2 2009    90   NA
  #  10    b    c2 2010   100   10
  #  11    b    c3 2009    80   NA
  #  12    b    c3 2010    99   19

更新

有相对差异
 df %>%
 filter(year!=2008)%>% 
 arrange(name, class, year)%>%
 group_by(class, name)%>%
 mutate(diff1=c(NA,diff(value)), rel_diff=round(diff1/value[row_number()-1],2))