按ID编号行

时间:2019-05-31 08:31:00

标签: r

很抱歉,如果这篇文章组织得不好,第一次出现堆栈溢出...

我正在尝试创建一列以在每个ID中创建订单,但是所不同的是,如果有间隔年份,则需要从头开始。 请在下面查看示例和预期结果。

enter image description here]

我找不到适合的代码。.我什么都没想到:(请帮助我!我非常感谢!

enter image description here]

3 个答案:

答案 0 :(得分:2)

一种选择是在year之间的差大于1时创建一个新的组变量,并使用row_number()在每个组中创建一个序列。

library(dplyr)
df %>%
  group_by(ID, group = cumsum(c(1, diff(Year) > 1))) %>%
  mutate(order = row_number()) %>%
  ungroup() %>%
  select(-group)

#    ID     Year order
#   <fct>  <int> <int>
# 1  A      2007     1
# 2  A      2008     2
# 3  A      2009     3
# 4  A      2013     1
# 5  A      2014     2
# 6  A      2015     3
# 7  A      2016     4
# 8  B      2010     1
# 9  B      2012     1
#10  B      2013     2

使用基数R ave

as.integer(with(df, ave(ID, ID, cumsum(c(1, diff(Year) > 1)), FUN = seq_along)))
#[1] 1 2 3 1 2 3 4 1 1 2

数据

df <- data.frame(ID = c(rep("A", 7), rep("B", 3)),
       Year = c(2007:2009, 2013:2016, 2010, 2012, 2013), stringsAsFactors = FALSE)

答案 1 :(得分:1)

一个data.table选项:

library(data.table)
setDT(df)
df[, jump := Year - shift(Year) - 1, by = ID
   ][is.na(jump), jump := 0
     ][, order := seq_len(.N), by = .(ID, cumsum(jump))]

#     ID Year jump order
#  1:  A 2007    0     1
#  2:  A 2008    0     2
#  3:  A 2009    0     3
#  4:  A 2013    3     1
#  5:  A 2014    0     2
#  6:  A 2015    0     3
#  7:  A 2016    0     4
#  8:  B 2010    0     1
#  9:  B 2012    1     1
# 10:  B 2013    0     2

或使用data.table::nafill()中可用的data.table v1.12.3(仍在开发中):

df[, jump := nafill(Year - shift(Year) - 1, fill = 0), by = ID
   ][, order := seq_len(.N), by = .(ID, cumsum(jump))]

答案 2 :(得分:0)

我们可以取“年”与“年”的lag之差,得到累积和,将group_by中的数字与“ ID”一起使用,并创建{{1} }为order

row_number()

数据

library(dplyr)
df %>% 
  group_by(ID, grp = cumsum(Year - lag(Year, default = Year[1]) > 1)) %>%
  mutate(order = row_number()) %>% 
  ungroup %>%
  select(-grp)
# A tibble: 10 x 3
#   ID     Year order
#   <chr> <dbl> <int>
# 1 A      2007     1
# 2 A      2008     2
# 3 A      2009     3
# 4 A      2013     1
# 5 A      2014     2
# 6 A      2015     3
# 7 A      2016     4
# 8 B      2010     1
# 9 B      2012     1
#10 B      2013     2