【问题标题】:Problem while using Group_by/mutate function in R在 R 中使用 Group_by/mutate 函数时出现问题
【发布时间】:2018-11-24 23:44:47
【问题描述】:

我正在尝试使用 group_by 计算前几行之间的差异,并在下面的数据帧上滞后

ID    DATE      Value
555  1/9/2018    10
555  2/9/2018    20
555  3/9/2018    50
555  4/9/2018    70
000  1/9/2018    0
000  2/9/2018    5
000  3/9/2018    15
111  1/9/2018    0
111  2/9/2018    15
111  3/9/2018    20
111  4/9/2018    25

区别应该如下所示:

ID    DATE      Value    Diff
555  1/9/2018    10       0
555  2/9/2018    20       10
555  3/9/2018    50       30
555  4/9/2018    70       20
000  1/9/2018    0        0
000  2/9/2018    5        5
000  3/9/2018    15       10
111  1/9/2018    0        0
111  2/9/2018    15       15
111  3/9/2018    20       5
111  4/9/2018    25       5

通过使用这行代码

data %>% 
  group_by(ID) %>%
  arrange(DATE) %>%
  mutate(Diff= Value - lag(Value, default = first(Value)))

它通过ID跳过分组条件并计算所有行之间的差异,如下所示:

ID    DATE      Value    Diff
555  1/9/2018    10       0
555  2/9/2018    20       10
555  3/9/2018    50       30
555  4/9/2018    70       20
000  1/9/2018    0        -70
000  2/9/2018    5        5
000  3/9/2018    15       10
111  1/9/2018    0        -15
111  2/9/2018    15       15
111  3/9/2018    20       5
111  4/9/2018    25       5

【问题讨论】:

  • 对我来说,您的代码工作正常,只是顺序或行不同。
  • 实际上,你的代码对我来说也很好。
  • @JuliusVainora 可以串联影响 group_by 吗?因为 ID 最初是从 2 列连接的
  • @ZidaneAhmed,如果我理解正确你的意思,单独连接应该不是问题,但也许它的完成方式(例如不同操作的顺序)会产生影响。我想你应该修改你的例子。
  • 您的代码运行良好。 Diff = c(0, diff(Value)) 是另一个不需要使用滞后的选项...

标签: r group-by rstudio dplyr


【解决方案1】:

您的代码适用于我(稍作调整)。

> data_new
# A tibble: 11 x 4
# Groups:   ID [3]
   ID    DATE     Value  Diff
   <chr> <fct>    <int> <int>
 1 555   1/9/2018    10     0
 2 555   2/9/2018    20    10
 3 555   3/9/2018    50    30
 4 555   4/9/2018    70    20
 5 000   1/9/2018     0     0
 6 000   2/9/2018     5     5
 7 000   3/9/2018    15    10
 8 111   1/9/2018     0     0
 9 111   2/9/2018    15    15
10 111   3/9/2018    20     5
11 111   4/9/2018    25     5

代码

data_new <- data %>% 
    group_by(ID) %>%
    mutate(Diff = Value - lag(Value, default = first(Value)))

数据

data <- structure(list(ID = c("555", "555", "555", "555", "000", "000", 
"000", "111", "111", "111", "111"), DATE = structure(c(1L, 2L, 
3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 4L), .Label = c("1/9/2018", "2/9/2018", 
"3/9/2018", "4/9/2018"), class = "factor"), Value = c(10L, 20L, 
50L, 70L, 0L, 5L, 15L, 0L, 15L, 20L, 25L)), row.names = c(NA, 
-11L), class = "data.frame")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2021-02-21
    • 2018-05-31
    相关资源
    最近更新 更多