如何匹配R中彼此+/- 5之间的观测值?

问题描述 投票:1回答:1

说我有一个如下所示的数据框:

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岁以内的观测值不匹配。

r string-matching
1个回答
1
投票

[这是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

© www.soinside.com 2019 - 2024. All rights reserved.