【问题标题】:R Diff function: Treat the first value of every groupR Diff函数:处理每组的第一个值
【发布时间】:2020-11-16 02:00:28
【问题描述】:

所以我对 R 的 diff 函数有一个小问题。我是否有以下形式的数据框df

ID  Var1   Difference
1    5        0
1    6        1
1    7        1
1    7        0
2    0        NA
2    2        2
2    4        2
2    7        3

Difference 列是通过以下方式获得的:

df %>% group_by("ID") %>%
       mutate(Difference = c(0, diff(Var1,
       lag = 1, differences = 1)))

但是我对第一个值为 0 不满意,尤其是每个组的第一个值都报告为 NA。相反,我想拥有:

ID  Var1   Difference
1    5        5
1    6        1
1    7        1
1    7        0
2    2        2
2    2        0
2    4        2
2    7        3

所以Difference 中每个组的第一个值应该等于Var1 值,diff 函数也应该考虑这个值并计算每个组的第二个Difference 值,考虑到这个值.

提前致谢

【问题讨论】:

    标签: r dataframe diff plyr


    【解决方案1】:

    试试:

    library(dplyr)                                                                                                            2L, 2L, 3L)), class = "data.frame", row.names = c(NA, -8L))
    diffmod <- function(x) {
      c(x[[1]], diff(x))
    }
    
    df %>% group_by(ID) %>%
      mutate(Difference = diffmod(Var1),) %>% ungroup()
    
    # A tibble: 8 x 3
         ID  Var1 Difference
      <int> <int>      <int>
    1     1     5          5
    2     1     6          1
    3     1     7          1
    4     1     7          0
    5     2     0          0
    6     2     2          2
    7     2     4          2
    8     2     7          3
    

    【讨论】:

      【解决方案2】:

      我们也可以使用 lag 并获得差异 (-)

      library(dplyr)
      df %>%
         group_by(ID) %>%
         mutate(Difference = Var1 - lag(Var1, default = 0))
      

      数据

      df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Var1 = c(5L, 
      6L, 7L, 7L, 0L, 2L, 4L, 7L)), row.names = c(NA, -8L), class = "data.frame")
      

      【讨论】:

        【解决方案3】:

        使用你的逻辑你可以做到:

        df %>%
         group_by(ID) %>%
         mutate(Difference = diff(c(0,Var1), lag = 1, differences = 1))
        # A tibble: 8 x 3
        # Groups:   ID [2]
             ID  Var1 Difference
          <int> <int>      <dbl>
        1     1     5          5
        2     1     6          1
        3     1     7          1
        4     1     7          0
        5     2     0          0
        6     2     2          2
        7     2     4          2
        8     2     7          3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 2022-01-07
          • 1970-01-01
          • 2022-01-01
          相关资源
          最近更新 更多