我有一个纵向数据,受访者被招募为队列。现在,我有他们进行调查的年份。但我想创建一个新的专栏,简单地计算一个人是第一次、第二次还是第三次参加调查。
原始表格
PersonID | SurveyYear | SurveyQ1Rating | |||||||
---|---|---|---|---|---|---|---|---|---|
12 | 2013 | 4 | >f | ||||||
12 | 2012 | 4 | >f | ||||||
12 | 2010 | 3 | f | ||||||
2 | 2007 | >td style="text-align:centre;">4m | |||||||
2 | 2008 | 3 | 3 | m | |||||
2009年 | 3年 | 2010年 | 5年 | 5 | 2014 | 5 | f |
base
解决方案:
df |>
transform(SurveyTime = ave(SurveyYear, PersonID, FUN = rank))
其dplyr
等价物:
library(dplyr)
df %>%
group_by(PersonID) %>%
mutate(SurveyTime = dense_rank(SurveyYear)) %>%
ungroup()
数据
df <- structure(list(PersonID = c(12L, 12L, 12L, 2L, 2L, 2L, 2L, 2L,
5L, 5L), SurveyYear = c(2013L, 2012L, 2010L, 2007L, 2008L, 2009L,
2010L, 2013L, 2013L, 2014L), SurveyQ1Rating = c(5L, 4L, 3L, 4L,
3L, 3L, 5L, 2L, 4L, 5L), SurveyQ2Rating = c(4L, 4L, 3L, 4L, 3L,
5L, 5L, 2L, 4L, 5L), Gender = c("f", "f", "f", "m", "m", "m",
"m", "m", "f", "f")), class = "data.frame", row.names = c(NA, -10L))
使用data.table
library(data.table)
setDT(df1)[, SurveyTime := frank(SurveyYear), PersonID]