Data.table: [バグ]カテゴリに小文字と大文字の両方が含まれている場合、%in%ステートメントが失敗する

作成日 2018年05月15日  ·  6コメント  ·  ソース: Rdatatable/data.table

バージョン1.11.2では、 %in% &ステートメントと%in%は大文字で始まる要素を尊重しません。 次に例を示します。

install.packages('data.table')
packageVersion("data.table")   # ‘1.11.2’
data("iris")
library(data.table)
iris <- data.table(iris)
iris$grp <- c('A', 'B')

[問題]
'virginica'の最初の文字を大文字にした後、 &ステートメントを使用すると、 %in%ステートメントを両方のグループに戻すことはできません。以下を参照してください。

iris[, Species1 := factor(Species, levels = c('setosa', 'versicolor', 'virginica'), labels = c('setosa', 'versicolor', 'Virginica'))]

iris[Species1 %in% c('setosa', 'Virginica') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 0          0         25 

【例】
以下のいくつかの例で試してみましたが、正常に機能します。
小文字のみを含むグループをサブセット化すると、両方のグループが見つかりました。

iris[Species1 %in% c('setosa', 'versicolor') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25         25          0 

または、どちらかのステートメントに括弧を追加すると、両方のグループが見つかりました。

iris[(Species1 %in% c('setosa', 'Virginica')) & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 
iris[Species1 %in% c('setosa', 'Virginica') & (grp == 'B'), table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 

このステートメントをsubset関数で試しましたが、機能します。

table(subset(iris, Species1 %in% c('setosa', 'Virginica') & grp == 'B')$Species1)
# setosa versicolor  Virginica 
# 25          0         25 

この機能は、古いバージョンのdata.tableパッケージで機能します(ここでは例としてバージョン1.10.4-3を使用してください)。

devtools::install_version("data.table", version = "1.10.4-3", repos = "http://cran.us.r-project.org")

packageVersion("data.table")   # ‘1.10.4.3’
data("iris")
library(data.table)
iris <- data.table(iris)
iris$grp <- c('A', 'B')

iris[, Species1 := factor(Species, levels = c('setosa', 'versicolor', 'virginica'), labels = c('setosa', 'versicolor', 'Virginica'))]

iris[Species1 %in% c('setosa', 'Virginica') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 

【セッション情報】

> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.11.2

loaded via a namespace (and not attached):
[1] compiler_3.4.4 tools_3.4.4    yaml_2.1.18   
bug regression

最も参考になるコメント

私は(うまくいけば)問題を修正するPRを作成しました。 これは、私自身のPRの1つによって導入された回帰です。

全てのコメント6件

@MarkusBonsch気になって見てみませんか? 奇妙に思える

verbose = TRUE

Optimized subsetting with index 'grp__Species1'
on= matches existing index, using index
Coercing character column i.'Species1' to factor to match type of x.'Species1'. If possible please change x.'Species1' to character. Character columns are now preferred in joins.

これは少なくともメッセージ、おそらく警告であるべきだと思います。

@ ddong63 %in%を文字と要素の混合に使用することは絶対に避けるべきことです。 matchを使用する前に適切なデータ型に強制変換してください。

@HughParsonage間もなく公開される予定です。https://github.com/Rdatatable/data.table/pull/2734が保留中です。

非常に奇妙です。 できるだけ早く調査して修正します。 レポートをありがとう。

@jangoreckiは正しかった。 両方の列のデータ型が文字または因子のいずれかで同じ場合、正常に機能します。
@MarkusBonschにご注目

私は(うまくいけば)問題を修正するPRを作成しました。 これは、私自身のPRの1つによって導入された回帰です。

このページは役に立ちましたか?
0 / 5 - 0 評価