Data.table: [bug]% dalam% pernyataan gagal jika kategori berisi baik huruf kecil maupun huruf besar

Dibuat pada 15 Mei 2018  ·  6Komentar  ·  Sumber: Rdatatable/data.table

Dalam versi 1.11.2 , saat menggunakan pernyataan %in% dan & bersama-sama, %in% tidak memperhitungkan faktor yang dimulai dengan huruf besar. Berikut ini contohnya:

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

[Isu]
Setelah menggunakan huruf besar pertama dalam 'virginica', pernyataan %in% tidak dapat dikembalikan ke kedua grup saat menggunakan pernyataan & , lihat di bawah ini:

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 

[Contoh]
Mencoba dengan beberapa contoh di bawah ini dan mereka bekerja dengan baik.
Jika saya membuat subset pada grup yang hanya berisi huruf kecil, kedua grup tersebut ditemukan.

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

Atau, jika saya menambahkan tanda kurung ke pernyataan mana pun, kedua grup ditemukan.

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 

Saya mencoba pernyataan ini dalam fungsi subset dan berhasil.

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

Fitur ini berfungsi dalam paket data.table versi lama (gunakan versi 1.10.4-3 sebagai contoh di sini):

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 

[info sesi]

> 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

Komentar yang paling membantu

Saya telah membuat PR yang (semoga) memperbaiki masalah tersebut. Ini adalah regresi yang diperkenalkan oleh salah satu PR saya sendiri.

Semua 6 komentar

@MarkusBonsch peduli untuk melihatnya? tampak aneh

Menggunakan 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.

Saya menduga ini setidaknya harus menjadi pesan, mungkin peringatan.

@ ddong63 Menggunakan %in% untuk karakter dan faktor campuran jelas merupakan sesuatu yang harus dihindari, paksakan ke tipe data yang benar sebelum menggunakan match .

@HughParsonage itu akan segera semoga, ada https://github.com/Rdatatable/data.table/pull/2734 tertunda.

Sangat sangat aneh. Saya akan menyelidiki dan memperbaiki ASAP. Terima kasih atas laporannya.

@jangorit benar. Jika kedua kolom memiliki tipe data yang sama, baik karakter maupun faktor, ini berfungsi dengan baik.
Sangat menghargai perhatian Anda @MarkusBonsch

Saya telah membuat PR yang (semoga) memperbaiki masalah tersebut. Ini adalah regresi yang diperkenalkan oleh salah satu PR saya sendiri.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat