【问题标题】:R How to transform values to most recent valueR如何将值转换为最新值
【发布时间】:2020-09-20 07:53:02
【问题描述】:

我的 df 看起来像这样:

Customer| Code  |Visit|
    A   |  A    | 2018|
    A   |  B    | 2019| 
    B   |  C    | 2017|
    B   |  D    | 2018|

如何转换列代码以反映客户 lvl 上的最新代码?

预期结果:

Customer| Code  |Visit|
    A   |  B    | 2018|
    A   |  B    | 2019| 
    B   |  D    | 2017|
    B   |  D    | 2018|

我试过了,但它不起作用:

df %>% group_by(Customer)%>% mutate(Code = max(Visit, Code))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以使用which.max获取Visit中最大值的索引,并提取对应的Code

    library(dplyr)
    
    df %>% group_by(Customer) %>% mutate(Code = Code[which.max(Visit)])
    
    # Customer Code  Visit
    #  <chr>    <chr> <int>
    #1 A        B      2018
    #2 A        B      2019
    #3 B        D      2017
    #4 B        D      2018
    

    【讨论】:

      【解决方案2】:

      由于对 data.frame 进行了预排序,因此解决方案更有效(因此我们始终对最后的观察结果进行子集化):

      library(data.table)
      
      result <- setDT(df)[order(Customer, Visit)][,.SD[.N],by=Customer]
      

      这对于更大的数据集可能很重要。

      【讨论】:

        【解决方案3】:

        base R 的选项

        df$Code <-  with(df,  Code[rep(which(ave(Visit, Customer, FUN = max)
                     == Visit), table(Customer))])
        df$Code
        #[1] "B" "B" "D" "D"
        

        【讨论】:

          猜你喜欢
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 2015-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-16
          • 1970-01-01
          相关资源
          最近更新 更多