R:函数“diff”对不同的组

  • 本文关键字:函数 diff diff plyr
  • 更新时间 :
  • 英文 :


在寻找解决我的问题的方法时,我发现了这个线程:函数"不同";我有一个非常相似的问题,所以我就用这个例子。

这是我想要的输出:

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

我有两个变量构成子组——class和name。所以我只想比较具有相同名称和类的值。我也想拥有2009年和2010年的不同。如果没有2008,diff 2009应该返回NA(因为它不能计算差值)。

我确信它的工作原理非常类似于其他线程,但我只是不能使它工作。我也使用了这段代码(通过对数据进行不同的排序,简单地解决了升序年份的问题),但不知何故,R仍然设法计算了一个差值,并且没有返回NA。

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

使用另一篇文章的数据集,我将做如下操作

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

使用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))

最新更新