如何按组存储行号

时间:2017-09-25 14:00:32

标签: r data.table

我有数据,存储为data.table dt或data.frame df,每个id - month组合有多个观察结果。我想将行号存储在变量中,我们称之为row

我知道如何在dplyr中执行此操作,但希望学习如何在(纯)data.table中执行此操作。我认为这是一个简单易行的操作,但我似乎无法找到有效的解决方案。

Reprex:

library(dplyr)
library(data.table)

df <- data_frame(id = c(1, 1, 1, 2, 2, 2), month = c(1, 1, 2, 1, 1, 2))
dt <- data.table(df)

我的dplyr解决方案提供了预期的输出:

df %>%
  group_by(id, month) %>%
  mutate(row = row_number(id))

# A tibble: 6 x 3
# Groups:   id, month [4]
     id month   row
  <dbl> <dbl> <int>
1     1     1     1
2     1     1     2
3     1     2     1
4     2     1     1
5     2     1     2
6     2     2     1

对data.table执行类似的操作会产生不同的结果:

dt[, row := row_number(id), by = c("id", "month")]

   id month row
1:  1     1   1
2:  1     1   1
3:  1     2   1
4:  2     1   1
5:  2     1   1
6:  2     2   1

或者:

dt[, row := .I, by = c("id", "month")]

   id month row
1:  1     1   1
2:  1     1   2
3:  1     2   3
4:  2     1   4
5:  2     1   5
6:  2     2   6

我假设我理解为什么会发生这种情况(row_number(id)只是引用每个组第一行的第一行编号),但不知道如何在纯data.table中获得预期结果。

1 个答案:

答案 0 :(得分:0)

dt[, row := row.names(dt), by = c("id", "month")]
dt

   id month row
1:  1     1   1
2:  1     1   2
3:  1     2   1
4:  2     1   1
5:  2     1   2
6:  2     2   1