2016-11-25 2 views
1

私は2つの変数、日付とチームとのデータテーブルを持っている:Rプログラミング - 日付と文字のインスタンスに番号を付けるインデックスを割り当てる変数

Date <- c("2016-11-20", "2016-11-20", "2016-11-20", "2016-11-21", "2016-11-21", "2016-11-21", "2016-11-22", "2016-11-22", "2016-11-22", "2016-11-22") 
Team <- c("NYK", "CLE", "DET", "DET", "ATL", "BRK", "CLE", "DET", "NYK", "TOR") 
DT <- data.table(Date, Team) 
DT$Date <- as.Date(Date) 

データテーブルのように見える終わる:

Date  Team 
1: 2016-11-20 NYK 
2: 2016-11-20 CLE 
3: 2016-11-20 DET 
4: 2016-11-21 DET 
5: 2016-11-21 ATL 
6: 2016-11-21 BRK 
7: 2016-11-22 CLE 
8: 2016-11-22 DET 
9: 2016-11-22 NYK 
10: 2016-11-22 TOR 

私がやっていることは、チームが何回表示されたかについてのインデックス列を追加することです。それは次のようになります。

  Date Team gamenum 
1: 2016-11-20 NYK  1 
2: 2016-11-20 CLE  1 
3: 2016-11-20 DET  1 
4: 2016-11-21 DET  2 
5: 2016-11-21 ATL  1 
6: 2016-11-21 BRK  1 
7: 2016-11-22 CLE  2 
8: 2016-11-22 DET  3 
9: 2016-11-22 NYK  2 
10: 2016-11-22 TOR  1 

私はコードを私は他の記事で見つけたもののように見えるだろうと思った:

NewDT <- DT[, ':='(Date = .N, gamenum = 1:.N), by = Team] 

が、それは私にエラー与える:

Error in `[.data.table`(DT, , `:=`(Date = .N, gamenum = 1:.N), by = Team) : 
    Type of RHS ('integer') must match LHS ('double'). To check and coerce would impact performance too much for the fastest cases. Either change the type of the target column, or coerce the RHS of := yourself (e.g. by using 1L instead of 1) 

私はクラスが一致しないことを意味しますが、追加の不要なデータを追加することなくこの作業を行う方法を理解することはできません。前もって感謝します。

答えて

2

は、私は本当にあなたがDate.Nを割り当てたいとは思わないthis-

DT$gamenum <- sapply(seq(DT$Team), function(x) sum(DT[1:x,Team] %in% DT[x,Team])) 
0

それはすべてdata.tableではないのですが、それは動作します:

library(data.table); library(purrr); library(dplyr); library(magrittr) 
DT <- fread("ID Date  Team 
1: 2016-11-20 NYK 
      2: 2016-11-20 CLE 
      3: 2016-11-20 DET 
      4: 2016-11-21 DET 
      5: 2016-11-21 ATL 
      6: 2016-11-21 BRK 
      7: 2016-11-22 CLE 
      8: 2016-11-22 DET 
      9: 2016-11-22 NYK 
      10: 2016-11-22 TOR") 
DT$ID %<>% gsub(":", "", .) 

DT %>% split(.$Team) %>% 
    purrr::map(~ mutate(., game_num = frank(Date))) %>% 
    bind_rows() %>% 
    arrange(as.numeric(ID)) 

    ID  Date Team game_num 
1 1 2016-11-20 NYK  1 
2 2 2016-11-20 CLE  1 
3 3 2016-11-20 DET  1 
4 4 2016-11-21 DET  2 
5 5 2016-11-21 ATL  1 
6 6 2016-11-21 BRK  1 
7 7 2016-11-22 CLE  2 
8 8 2016-11-22 DET  3 
9 9 2016-11-22 NYK  2 
10 10 2016-11-22 TOR  1 

あなたはarrange(Date, Team)と満足していた場合は、df$ID調整のことは自分を取り除くことができますが、順序があなたの希望とまったく同じではなかったであろう。

0

を試してみてください。与え

DT[, ':='(gamenum = 1:.N, no_of_games = .N), by = Team] 

> DT 
      Date Team gamenum no_of_games 
1: 2016-11-20 NYK  1   2 
2: 2016-11-20 CLE  1   2 
3: 2016-11-20 DET  1   3 
4: 2016-11-21 DET  2   3 
5: 2016-11-21 ATL  1   1 
6: 2016-11-21 BRK  1   1 
7: 2016-11-22 CLE  2   2 
8: 2016-11-22 DET  3   3 
9: 2016-11-22 NYK  2   2 
10: 2016-11-22 TOR  1   1 
2つの追加の列がシーケンス番号とその Teamのためのゲームの数あるところあなたはおそらく、このことを意味します
関連する問題