【问题标题】:How do I turn non-sequential data in R into sequential data while grouping on an ID如何在按 ID 分组时将 R 中的非顺序数据转换为顺序数据
【发布时间】:2021-04-05 20:21:39
【问题描述】:

我有以下数据框。

df <- data.frame(Person = c("Eric","Eric","Eric","Joe","Joe","Joe"), Order = c(2,7,4,2,5,1),
                 Value = c("A","A","B","C","A","B"))

订单列目前是随机顺序。每个人都有 3 个顺序值,它们是 1 到 8 之间的随机整数。顺序始终是 1 到 8 之间的值,一个人没有重复。如何转换 Order 列以反映按人分组的值的顺序?因此,订单列将始终介于 1 和 3 之间。所需的输出将如下所示。

df <- data.frame(Person = c("Eric","Eric","Eric","Joe","Joe","Joe"), Order = c(1,3,2,2,3,1),
                 Value = c("A","A",'B","C","A","B"))```

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    也许,我们需要rank按“人”分组的“订单”

    library(dplyr)
    df %>% 
       group_by(Person) %>%
       mutate(Order = rank(Order))
    

    【讨论】:

      【解决方案2】:

      一些基本的 R 选项

      • 使用rank
        df,
        Order = ave(Order, Person, FUN = rank)
      )
      
      • 使用match + sort
      transform(
        df,
        Order = ave(Order, Person, FUN = function(x) match(x,sort(x)))
      )
      

      【讨论】:

        【解决方案3】:

        使用data.table

        library(data.table)
        
        setDT(df)[, Order := frank(Order), Person]
        df
        
        #   Person Order Value
        #1:   Eric     1     A
        #2:   Eric     3     A
        #3:   Eric     2     B
        #4:    Joe     2     C
        #5:    Joe     3     A
        #6:    Joe     1     B
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-09
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 2021-02-04
          • 1970-01-01
          • 2018-07-17
          相关资源
          最近更新 更多