【问题标题】:R: change cell value by comparing to cell aboveR:通过与上面的单元格比较来更改单元格值
【发布时间】:2022-07-06 21:53:17
【问题描述】:

我有以下数据框

ID year level
1  2000  NA
1  2001  3
1  2002  3
1  2003  2
1  2004  1
2  2000  1
2  2001  3
2  2002  3
2  2003  3
2  2004  3

如果前一个较小,我想根据前一个 ID 更新“级别”列中的每个值。

数据框应如下所示

ID year level
1  2000  NA
1  2001  3
1  2002  3
1  2003  2
1  2004  1
2  2000  1
2  2001  1
2  2002  1
2  2003  1
2  2004  1

我尝试使用数据表中的移位,但它只更改了一个单元格。 我得到了这个结果

ID year level
1  2000  NA
1  2001  3
1  2002  3
1  2003  2
1  2004  1
2  2000  1
2  2001  1
2  2002  3
2  2003  3
2  2004  3

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:

    你可以使用

    df$level <- Reduce(function(...) min(..., na.rm = T), df$level, accumulate = T)
    

    获得你想要的结果:

    ID  year level
      1 2000    NA
      1 2001     3
      1 2002     3
      1 2003     2
      1 2004     1
      2 2000     1
      2 2001     1
      2 2002     1
      2 2003     1
      2 2004     1
    

    【讨论】:

      【解决方案2】:
      library(data.table)
      df <- data.frame(
                ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
                year = c(2000L,2001L,2002L,2003L,2004L,
                         2000L,2001L,2002L,2003L,2004L),
             level = c(NA, 3L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L)
        )
      
      setDT(df)[!is.na(level), level := cummin(level), by = ID][]
      #>     ID year level
      #>  1:  1 2000    NA
      #>  2:  1 2001     3
      #>  3:  1 2002     3
      #>  4:  1 2003     2
      #>  5:  1 2004     1
      #>  6:  2 2000     1
      #>  7:  2 2001     1
      #>  8:  2 2002     1
      #>  9:  2 2003     1
      #> 10:  2 2004     1
      

      reprex package (v2.0.1) 于 2022-07-06 创建

      【讨论】:

        【解决方案3】:

        accumulate()tidyverse 解决方案来自 purrr

        library(tidyverse)
        
        df %>%
          group_by(ID) %>%
          mutate(level2 = accumulate(level, min, na.rm = TRUE)) %>%
          ungroup()
        
        # # A tibble: 10 × 4
        #       ID  year level level2
        #    <int> <int> <int>  <int>
        #  1     1  2000    NA     NA
        #  2     1  2001     3      3
        #  3     1  2002     3      3
        #  4     1  2003     2      2
        #  5     1  2004     1      1
        #  6     2  2000     1      1
        #  7     2  2001     3      1
        #  8     2  2002     3      1
        #  9     2  2003     3      1
        # 10     2  2004     3      1
        

        【讨论】:

          猜你喜欢
          • 2015-03-02
          • 2012-05-05
          • 2019-07-05
          • 1970-01-01
          • 2020-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多