【问题标题】:R Data.Table - APPLY/SHIFT processing by ROW (Retain or Dynamic Shift Processing)R Data.Table - 按 ROW 应用/移位处理(保留或动态移位处理)
【发布时间】:2019-09-29 22:22:44
【问题描述】:

我想处理每一行的数据。假设我们在 4 天内收集了两个“cyl”的“mpg”值。我想得出相对于一天的最小 mpg 值)

原始数据

** 天,cyl,mpg**

  • 1,4,34.4
  • 2,4,21.3
  • 3,4,23.3
  • 4,4,25.0
  • 1,3,23.0
  • 2,3,27.0
  • 3,3,18.3
  • 4,3,17.3

预期输出

** day,cyl,mpg,min_mpg**

  • 1,4,34.4,34.4
  • 2,4,21.3,21.3
  • 3,4,23.3,21.3
  • 4,4,25.0,21.3
  • 1,3,23.0,23.0
  • 2,3,27.0,23.0
  • 3,3,18.3,18.3
  • 4,3,17.3,17.3

我给出了以下几点想法......

  1. For 循环处理(这确实不是最有效的选项)

  2. APPLY 和 SHIFT 函数(保留上一行的最小值 在全局变量中处理并将每个 GROUP 重置为 NA。一世 未能将最小 mpg 值保留到全局变量中)

  3. APPLY 和 SHIFT 函数(将“-1”一直移动到第 1 行 每一行。在 APPLY 函数中放置一个循环。这个选项 可能会做更多的冗余处理)

我尝试使用下面博客中描述的 rowShift 函数,但我的要求是我需要动态移位 Use a value from the previous row in an R data.table calculation

是否有任何“矢量化”选项可用?还是传统的 FOR LOOP 将是唯一的选择?我更喜欢使用 base R 的选项(数据框或数据表)

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用cummin

    library(dplyr)
    df1 %>% 
       group_by(cyl) %>% 
       mutate(min_mpg = cummin(mpg))
    # A tibble: 8 x 4
    # Groups:   cyl [2]
    #    day   cyl   mpg min_mpg
    #  <int> <int> <dbl>   <dbl>
    #1     1     4  34.4    34.4
    #2     2     4  21.3    21.3
    #3     3     4  23.3    21.3
    #4     4     4  25      21.3
    #5     1     3  23      23  
    #6     2     3  27      23  
    #7     3     3  18.3    18.3
    #8     4     3  17.3    17.3
    

    base R中,我们可以使用ave

    df1$min_mpg <- with(df1, ave(mpg, cyl, FUN = cummin))
    

    或使用data.table

    library(data.table)
    setDT(df1)[, min_mpg := cummin(mpg), by = cyl][]
    

    数据

    df1 <- structure(list(day = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), cyl = c(4L, 
    4L, 4L, 4L, 3L, 3L, 3L, 3L), mpg = c(34.4, 21.3, 23.3, 25, 23, 
    27, 18.3, 17.3)), class = "data.frame", row.names = c(NA, -8L
    ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2016-03-23
      • 2012-03-29
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多