在搜索我的问题的解决方案时,我找到了这个帖子: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))
答案 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))