2017-03-02 5 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の場合は新しいバージョンがあります。どうか、「?unique」のドキュメントを読んでください。 "デフォルトではすべてのカラムが使用されていますが、これはdata.frameメソッドとの一貫性のために最近変更されました。バージョン<1.9.8ではデフォルトはkey(x)*"でした。次に、あなたのWindows上で 'unique(e、by =" a ")'を試してください。 –

答えて

3

これは、両方に異なるdata.tableバージョンがあるからです。 Macでは< 1.9.8バージョン(デフォルトではキーを使用します)を持っていますが、Windowsでは新しいバージョンを持っています(そうではありません)。

(data.table V1.9.8の+に)?uniqueで述べたように:デフォルトでは

すべての列が使用されています。これは最近 のdata.frameメソッドとの一貫性のために変更されました。バージョンでは< 1.9.8デフォルトでは、それ以外の場合は、単にすべての列を使用しますが、今から、あなたはすでにキーが設定されている場合でも、明示的にby変数を指定する必要があり、 キー(X)

意味でした。あなたの具体的な例

、これは

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()'を作ることでもあり、コードの読者はそれが起こっていることを後に思い出させます。前に、あなたは知っていなければならず、キーが上流に追加された場合、それは「ユニーク」の振る舞いを変えるでしょう。今はより堅牢でなければならない。 –

関連する問題