2017-07-12 1 views
2

Si je crée une R data.table avec des colonnes de chaîne sans appeler stringsAsFactors=TRUE, puis que j'essaie de prendre des lignes uniques de la table de données avec unique, les chaînes sont supprimées de la table résultante, mais elles sont prises en compte pour déterminer les lignes uniques .Comment faire fonctionner unique() sur data.tables avec des colonnes de caractères?

> dt <- data.table(x=c('a', 'a', 'b', 'c'), y=c(1, 1, 2, 2), stringsAsFactors=FALSE) 
> unique(dt) 
    x y 
1: 1 
2: 2 
3: 2 
> dt <- data.table(x=c('a', 'a', 'b', 'c'), y=c(1, 1, 2, 2), stringsAsFactors=TRUE) 
> unique(dt) 
    x y 
1: a 1 
2: b 2 
3: c 2 

Est-ce correct? Je suis sur Cygwin et j'ai découvert quelques mystérieux problèmes spécifiques à Cygwin dans les internes de R avant. Voici la lecture de sessionInfo():

R version 3.4.0 (2017-04-21) 
Platform: x86_64-unknown-cygwin (64-bit) 
Running under: CYGWIN_NT-6.1 INT-3A02 2.8.1(0.312/5/3) 2017-07-03 14:11 x86_64 Cygwin 

Matrix products: default 
LAPACK: /usr/lib/R/modules/lapack.dll 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

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

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

loaded via a namespace (and not attached): 
[1] bit_1.1-12  compiler_3.4.0 bit64_0.9-7 
+3

Sur ma machine (Ubuntu 16.04 avec 'R version 3.4.1 (2017-06-30) - "Single Candle" ') fonctionne aussi en utilisant la première option. – Garini

+0

Je ne suis pas surpris. J'ai eu des problèmes Cygwin uniquement avec les chaînes R avant (https://stackoverflow.com/questions/44187906/merging-large-data-tables-on-character-columns-causes-segfault). –

Répondre

1

La fonction duplicated() peut fournir une solution de contournement. dt[!duplicated(dt), ] renvoie les mêmes résultats que unique(dt) pour les deux cas sur mon système (Linux Ubuntu, la version R-3.13.0-121 générique)

library(data.table) 
dt <- data.table(x=factor(c('a', 'a', 'b', 'c')), y=c(1, 1, 2, 2)) 
all.equal(unique(dt), dt[!duplicated(dt), ]) 
[1] TRUE 
> 

dt <- data.table(x=c('a', 'a', 'b', 'c'), y=c(1, 1, 2, 2)) 
all.equal(unique(dt), dt[!duplicated(dt), ]) 
[1] TRUE 
> 

poste connexe: Finding ALL duplicate rows, including "elements with smaller subscripts"

+0

Je ne sais pas pourquoi cela devrait fonctionner, mais c'est le cas. Merci! –