代码之家  ›  专栏  ›  技术社区  ›  Shree

按组在包含和低于给定行的行中查找最小值

  •  0
  • Shree  · 技术社区  · 6 年前

    Mat 找到最小值 value 在每一行中的每一行,包括给定行及其下的行。代码显示测试数据和我的代码。字段 min_value 是所需的输出。想知道是否有 tidyverse 怎么办-

    df <- structure(list(Mat = c("A", "A", "A", "A", "A", "A", "B", "B", 
    "B", "B", "B", "B"), value = c(11L, 22L, 0L, 22L, 33L, 43L, 108L, 
    152L, 0L, 486L, 706L, 830L)), .Names = c("Mat", "value"), class = "data.frame", row.names = c(NA, 
    -12L))
    
    group_by(df, Mat) %>%
      mutate(
        min_value = sapply(row_number(), function(a) min(value[a:length(value)]))
      ) %>%
      ungroup()
    
    # A tibble: 12 x 3
       Mat   value min_value
       <chr> <int>     <int>
     1 A        11         0
     2 A        22         0
     3 A         0         0
     4 A        22        22
     5 A        33        33
     6 A        43        43
     7 B       108         0
     8 B       152         0
     9 B         0         0
    10 B       486       486
    11 B       706       706
    12 B       830       830
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Frank    6 年前

    你可以。。。

    df %>% group_by(Mat) %>% mutate(v = rev(cummin(rev(value))))
    
    # or maybe more 'verse-like
    df %>% group_by(Mat) %>% mutate(v = value %>% rev %>% cummin %>% rev)
    
    # or ...
    below_min = . %>% rev %>% cummin %>% rev
    df %>% group_by(Mat) %>% mutate(v = below_min(value))
    

    或者使用data.table(修改 df 本身)。。。

    library(data.table)
    setDT(df)
    
    df[order(.N:1), v := cummin(value), by=Mat]
    

    有一个类似的问题;A在这里,如果有人感兴趣: