按列分组的数据框中R中行的差异

时间:2015-10-10 00:48:33

标签: r dataframe diff lag

我希望通过app_name按版本计算差异。我的数据集如下所示:app_name,version_id,count,[difference]

这是数据集

    data = structure(list(app_name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"), version_id = c(1, 
1.1, 2.3, 2, 3.1, 3.3, 4, 1.1, 2.4), count = c(600L, 620L, 620L, 
200L, 200L, 250L, 250L, 15L, 36L)), .Names = c("app_name", "version_id", 
"count"), class = "data.frame", row.names = c(NA, -9L))

鉴于此data.frame,如何通过app_name和&获取计数的滞后差异。 VERSION_ID?每个应用程序的初始(第一个)版本差异将为零,因为没有区别。

以下是最终结果与最终'diff'列

相似的示例
structure(list(app_name = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"), version_id = c(1, 
1.1, 2.3, 2, 3.1, 3.3, 4, 1.1, 2.4), count = c(600L, 620L, 620L, 
200L, 200L, 250L, 250L, 15L, 36L), diff = c(0, 20, 0, 0, 0, 1.25, 
0, 0, 2.4)), .Names = c("app_name", "version_id", "count", "diff"
), class = "data.frame", row.names = c(NA, -9L))

2 个答案:

答案 0 :(得分:1)

尝试使用dplyrlag

library(dplyr)
data %>% group_by(app_name) %>%
         mutate(diffvers = version_id - dplyr::lag(version_id, default = version_id[1]),
                diffcount = count - dplyr::lag(count, default = count[1]))

Source: local data frame [9 x 5]
Groups: app_name [3]

  app_name version_id count diffvers diffcount
    (fctr)      (dbl) (int)    (dbl)     (int)
1        a        1.0   600      0.0         0
2        a        1.1   620      0.1        20
3        a        2.3   620      1.2         0
4        b        2.0   200      0.0         0
5        b        3.1   200      1.1         0
6        b        3.3   250      0.2        50
7        b        4.0   250      0.7         0
8        c        1.1    15      0.0         0
9        c        2.4    36      1.3        21

答案 1 :(得分:0)

我们可以使用<% @user.discipleship_classes.each do |d_class|%> <%= d_class.class.name%> <%= d_class.some_intrinsic_detail_of_discipleship%> <% end %> 。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (data.table),按&#39; app_name&#39;分组,循环(setDT(data)lapply(..中指定的列,获取当前元素与其{{1}之间的差异(.SDcols默认情况下为lag)并指定(shift)输出以创建新列。

type='lag'