[英]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.