说我有一个如下所示的数据框:
dat <- data.frame("firstName" = c("John", "John", "Mary", "Bob", "Mary", "Bob"), "age"= c(21, 24, 35, 30, 20, 27))
我想创建第三个变量dat$id
,如果观察值的年龄在另一个观察值的+/- 5年以内并且具有相同的firstName,则分配相同的数字。因此数据框将如下所示:
dat <- data.frame("firstName" = c("John", "John", "Mary", "Bob", "Mary", "Bob"), "age"= c(21, 24, 35, 30, 20, 27), "id"= c(1,1,2,3,4,3))
我拥有一个非常庞大的名称和年龄数据集,希望找到一种更自动的分配ID的方法。我考虑过从20岁起每5年创建一个年龄段,但这与位于不同年龄段但仍在5岁以内的观测值不匹配。
[这是lag
中的dplyr
的一种方法:
library(dplyr)
dat %>%
group_by(firstName) %>%
arrange(firstName,age) %>%
mutate(id = cumsum(!(age - (lag(age,default = -Inf) ) <= 5)))
# A tibble: 6 x 3
# Groups: firstName [3]
firstName age id
<fct> <dbl> <int>
1 Bob 27 1
2 Bob 30 1
3 John 21 1
4 John 24 1
5 Mary 20 1
6 Mary 35 2