我有兴趣将 dataf 中的日期列更改为与 results$order 中的 id 相对应的有序数字(最早日期=1,第二早=2...等等)。如果一个 id 只出现一次,我希望顺序为 1。
date=c("2012-02-18", "2013-03-01", "2013-04-11", "2013-06-06", "2013-09-20", "2013-07-02")
datef=strptime(date, format="%Y-%m-%d")
dataf=data.frame(id=c(20, 20, 20, 21, 21, 22),
date=datef,
service=c("web", "phone", "person", "phone", "web", "web"))
> dataf
id date service
1 20 2012-02-18 web
2 20 2013-03-01 phone
3 20 2013-04-11 person
4 21 2013-06-06 phone
5 21 2013-09-20 web
6 22 2013-07-02 web
我什至很难找到正确的措辞来寻找这个困境的答案。我这是想胁迫吗?或索引?将 dataf$dates 放入下面的 results$order 中?
results=data.frame(id=c(20, 20, 20, 21, 21, 22),
order=c(1,2,3,1,2,1),
service=c("web", "phone", "person", "phone", "web", "web"))
> results
id order service
1 20 1 web
2 20 2 phone
3 20 3 person
4 21 1 phone
5 21 2 web
6 22 1 web
与
dplyr
:
library(dplyr)
dataf |>
mutate(order = rank(date), .by = id)
# # A tibble: 6 x 4
# # Groups: id [3]
# id date service order
# <dbl> <dttm> <fct> <dbl>
# 1 20 2012-02-18 00:00:00 web 1
# 2 20 2013-03-01 00:00:00 phone 2
# 3 20 2013-04-11 00:00:00 person 3
# 4 21 2013-06-06 00:00:00 phone 1
# 5 21 2013-09-20 00:00:00 web 2
# 6 22 2013-07-02 00:00:00 web 1
与
data.table
:
library(data.table)
setDT(dataf)
setorder(dataf, id, date)
dataf[, order := 1:.N, by = id]
> dataf
id date service order
1: 20 2012-02-18 web 1
2: 20 2013-03-01 phone 2
3: 20 2013-04-11 person 3
4: 21 2013-06-06 phone 1
5: 21 2013-09-20 web 2
6: 22 2013-07-02 web 1