2017-09-25 3 views
1

나는 데이터가 또는 데이터 으로 저장되고 id - month 조합 당 여러 번 관찰 한 데이터가 있습니다. 변수에 행 번호를 저장하고 싶습니다. row이라고 부릅시다.그룹별로 행 번호를 저장하는 방법

dplyr에서이 작업을 수행하는 방법을 알고 있지만 (순수한) data.table에서 수행하는 방법을 배우고 싶습니다. 나는 그것이 쉬운 작업이라고 생각하지만 작동하는 해결책을 찾을 수없는 것 같습니다.

Reprex는 : 다른 data.table 수익률 뭔가에 유사한 작업을 수행

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 

:

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 솔루션은 예상 출력을 제공

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에서 예상되는 결과를 얻는 방법을 모른다. 그냥`DT

+3

[행 : = 서열 (.N) = C를 ("ID", "달")에 의해]'돌이켜 보면 그렇게 간단한 – Sotos

+0

. 고마워요! –

+2

@Sotos Fyi,'dt [, v : = rowid (id, month)]' – Frank

답변

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 
+0

내 의견보다 더 나은 대답 - 응답 할 때 나는 이것들을 보지 못했습니다 :) – conor