我有数据,存储为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中获得预期结果。
答案 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