2017-09-25 7 views
1

データは、データテーブルdtまたはデータフレームdfとして保存され、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で期待される結果を得る方法はわかりません。

+3

ちょうど 'DT:後知恵で非常に単純な ' – Sotos

+0

[、行= Cの( "ID"、 "月")によって= SEQ(.N)]。どうもありがとう! –

+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

関連する問題