2017-07-12 20 views
2

如果我使用字符串列創建R data.table而不調用stringsAsFactors=TRUE,然後嘗試使用unique獲取數據表的唯一行,則從結果表中刪除字符串,儘管在確定哪些行是唯一的。如何獲得unique()以處理data.tables與字符列?

> 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 

這是正確的行爲嗎?我在Cygwin上發現了R內部的一些神祕的Cygwin特定問題。下面是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

在我的機器(Ubuntu的16.04帶的r版本3.4.1(2017-06-30) - 「單個蠟燭」)它也在使用第一個選項。 – Garini

+0

我並不感到驚訝;我以前只有Cygwin的R字符串問題(https://stackoverflow.com/questions/44187906/merging-large-data-tables-on-character-columns-causes-segfault)。 –

回答

1

duplicated()功能可以提供一種解決方法。 dt[!duplicated(dt), ]返回相同的結果unique(dt)兩種情況下我的系統(Ubuntu Linux操作系統,R版本3.13.0-121-通用)

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 
> 

相關職位上:Finding ALL duplicate rows, including "elements with smaller subscripts"

+0

我不知道爲什麼這應該工作,但它確實。謝謝! –

相關問題