簡體   English   中英

在 R 的 data.table 中創建分組的“順序”變量

[英]create grouped "order" variable in data.table in R

我有一個數據表:

example <- data.table(year = c(2016, 2017, 2018, 2016, 2017, 2020), 
           ID = c("A","A","A", "B", "B","B"))

我需要一個多年來的訂單變量。 排名最低的最高年份,分別對應每個id 結果將是:

exmampleResult <- data.table(year = c(2016, 2017, 2018, 2016, 2017, 2020), 
                             ID = c("A","A","A", "B", "B","B"), 
                             yearRank = c(3, 2, 1, 5, 4, 1))

如何在 data.table 中做到這一點?

我嘗試在列表列表中拆分數據表:

exampleList <- lapply(split(example,example$ID), function(x) as.list(x))

然后使用另一個應用計算訂單。 然而,這似乎太復雜了。 有沒有更簡單的方法?

按'ID'分組,從'year'的min到'year'的max獲取序列( : ,對其進行排名( frank )並使用match來獲取索引以子集排名

library(data.table)
example[,  yearRank := 
      {yr <- (min(year):max(year))
      frank(-yr)[match(year, yr)]
     },ID]

-輸出

> example
    year     ID yearRank
   <num> <char>    <num>
1:  2016      A        3
2:  2017      A        2
3:  2018      A        1
4:  2016      B        5
5:  2017      B        4
6:  2020      B        1

這是利用tidyverse的另一種選擇

library(data.table)
library(tidyverse)

example <- data.table(year = c(2016, 2017, 2018, 2016, 2017, 2020), 
                      ID = c("A","A","A", "B", "B","B"))

exampleResult <- example %>%
  group_by(ID) %>%
  mutate(yearRank = rank(desc(year))) %>%
  ungroup() %>%
  data.table()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM