バージョン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
@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つによって導入された回帰です。
最も参考になるコメント
私は(うまくいけば)問題を修正するPRを作成しました。 これは、私自身のPRの1つによって導入された回帰です。