1

年、ID、カウントの 3 つの列を持つ data.table テストがあります (以下の最初の 3 つの列を参照)。次のように、ID と年をまとめて 4 番目の列を追加したいと思います。

setkey(test, Year, ID)
test[, annualCount := sum(Count), by=list(Year, ID)]

私が得たものは奇妙に見えます: 関数 [ は自動的に私のannualCount. たとえば、ID 210 に Y1 を指定すると、9 ではなく 8 が返されます。

data.table のバグですか?

    Year       ID    Count  annualCount
 1:   Y1      210        1            9
 2:   Y1      210        1            9
 3:   Y1      210        0            9
 4:   Y1      210        1            9
 5:   Y1      210        1            9
 6:   Y1      210        1            9
 7:   Y1      210        1            9
 8:   Y1      210        1            9
 9:   Y1      210        1            9
10:   Y1     3197        1            6
11:   Y1     3197        1            6
12:   Y1     3197        0            6
13:   Y1     3197        1            6
14:   Y1     3197        1            6
15:   Y1     3197        1            6    

更新: R バージョン 2.15.0 (2012-03-30) を使用していますが、data.table_1.8.6 をインストールしました。このパッケージをインストールすると、このバージョンは 2.15.1 でビルドされているという警告が表示されました。これがバグの原因ですか?

更新 2: 最新の R (現時点では 2.15.2) をインストールしましたが、役に立ちません。同じデータセットで、私が呼び出すと

  test1 <- test[, list(annualCount = sum(Count)), by=list(Year, ID)]

その後、正しい結果が得られます。でも電話したら

test2 <- test[, list(annualCount = sum(Count, na.remove = T)), by=list(Year, ID)]

その後 [自動的に合計に 1 を追加します。残念ながら、このエラーでこのデータセットをゼロから複製することはできませんでした。

更新 3: dput(test) 出力。

structure(list(Year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Y1", "Y2", "Y3"), class = "factor"), 
               ID = c(210, 210, 210, 210, 210, 210, 210, 210, 210, 
                            3197, 3197, 3197, 3197, 3197, 3197), 
               Count = c(1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)), 
          .Names = c("Year","ID", "Count"), class = c("data.table", "data.frame"), 
          row.names = c(NA, -15L), .internal.selfref = <pointer: 0x7fb6dc000778>)

ありがとう。

4

1 に答える 1

3

これは の問題でdata.tableはなく、人的エラーです ;)

複製するために、ここにいくつかのサンプルデータがあります。remove s の引数がある場合とない場合NAの関数の結果を確認するために、いくつかの値を含めました。sumNAna.rmna.remove

set.seed(1)
test <- data.table(Year = rep("Y1", 15),
                   ID = c(rep(210, 9), rep(3197, 6)),
                   Count = sample(c(0, 1, NA), 15, 
                                  prob=c(.2, .65, .15), 
                                  replace=TRUE),
                   key = "Year,ID")
test
#     Year   ID Count
#  1:   Y1  210     1
#  2:   Y1  210     1
#  3:   Y1  210     1
#  4:   Y1  210    NA
#  5:   Y1  210     1
#  6:   Y1  210    NA
#  7:   Y1  210    NA
#  8:   Y1  210     0
#  9:   Y1  210     1
# 10:   Y1 3197     1
# 11:   Y1 3197     1
# 12:   Y1 3197     1
# 13:   Y1 3197     0
# 14:   Y1 3197     1
# 15:   Y1 3197     0

新しい列を作成する前に、いくつかの集計を行って、 のさまざまなオプションで何が起こるかを見てみましょうsum

test[, list(annualCount = sum(Count)), by = key(test)]
#    Year   ID annualCount
# 1:   Y1  210          NA
# 2:   Y1 3197           4
test[, list(annualCount = sum(Count, na.rm = TRUE)), by = key(test)]
#    Year   ID annualCount
# 1:   Y1  210           5
# 2:   Y1 3197           4

次に、期待どおりの結果が得られる新しい列を作成します。

test[, annualCount := sum(Count, na.rm = TRUE), by = key(test)][]
#     Year   ID Count annualCount
#  1:   Y1  210     1           5
#  2:   Y1  210     1           5
#  3:   Y1  210     1           5
#  4:   Y1  210    NA           5
#  5:   Y1  210     1           5
#  6:   Y1  210    NA           5
#  7:   Y1  210    NA           5
#  8:   Y1  210     0           5
#  9:   Y1  210     1           5
# 10:   Y1 3197     1           4
# 11:   Y1 3197     1           4
# 12:   Y1 3197     1           4
# 13:   Y1 3197     0           4
# 14:   Y1 3197     1           4
# 15:   Y1 3197     0           4
于 2012-12-01T07:27:50.137 に答える