2017-03-02 73 views
0

我主要在Mac中使用Rstudio。最近我不得不開始使用Windows。但是,我發現unique()不會根據鍵在data.table中提供唯一的行。下面是一個示例:獨特不使用密鑰作爲默認了

a=c(2,3,3,3,3,5,6,7) 
b=c("a","a","f","g","a","d","t","l") 
e=data.table(a,b) 
setkey(e, a) 
key(e) # this works fine 
unique(e) 

unique()僅刪除整個行(第5行)的副本。完全相同的代碼在我的Mac上運行良好。

+3

這是因爲你在兩個版本上都有不同的data.table版本。在Mac上,你有一個<1.9.8版本,而在Windows上你有一個更新的版本。請請閱讀「獨特」的文檔,例如「*默認情況下,所有列都在使用,最近爲了與data.frame方法保持一致而進行了更改。在版本<1.9.8中,默認爲key(x)*」。然後在Windows上嘗試'unique(e = by「a」)''。 –

回答

3

這是因爲你有兩個不同的data.table版本。在Mac上,你有一個< 1.9.8版本(它仍然使用鍵作爲默認值),而在Windows上你有一個更新的版本(不會)。

?unique指出(在data.table V1.9.8 +):

默認情況下正在使用的所有列。這是最近更改爲 與data.frame方法的一致性。在版本1.9.8 <默認爲 鍵(X)

意義,從現在開始,你需要明確指定by變量,即使你已經擁有的密鑰設置,否則將只使用所有列。

爲了您的具體的例子,這個工程

unique(e, by = "a") 
# a b 
# 1: 2 a 
# 2: 3 a 
# 3: 5 d 
# 4: 6 t 
# 5: 7 l 

或者像@Frank在評論中提到的,你也可以指定使用unique(a, by = key(a))by PARAM的關鍵。

+2

是的。這種改變也是爲了明確地需要'by = key()',以便後面的代碼讀者能夠提醒這種情況正在發生。之前,你必須知道,如果一個關鍵字被添加到上游,它會改變'unique'的行爲。現在應該更健壯。 –