2016-08-19 2 views
0

データフレーム内の列に長さゼロの文字列が含まれている場合、それをlevels()関数に渡すと、文字列。しかし、unique()はそうしません。これは私には直感的ではないようですが、私はこれを説明する文書を見つけることができませんでした。誰がなぜこれが当てはまるのか知っていますか?Q:データフレーム内の長さゼロの文字列に対するlevels()とunique()の区別

例:

[1] a b 
Levels: a b 

レベル()」が含まれる:

unique(d$col1) 
(一意

)長さゼロの文字列要素が返されない:ユニーク

コール()

d <- data.frame(col1 = c("", 'a', 'b')) # Contains "". 
"結果:

levels(d$col1) 
[1] "" "a" "b" 
+2

unique' 'の出力は「」を返すんが、二重引用符は、プリントアウトに欠けているので、もう少し難しいのです認識する。これを見るには、 "a"と "b"だけでdata.frameを作成し、出力のスペーシングを比較してください。 col1は文字型ではなく、むしろ要素であることにも注意してください。 'data.frame'で文字ベクトルを取得するには、stringsAsFactors = FALSEを使用します。 – lmo

答えて

0

これは印刷方法と関係がある。ドキュメントから、戻り値はunique

ベクトルの場合、同じタイプのxのオブジェクトですが、各複製要素のコピーは1つのみです。属性はコピーされません(結果に名前はありません)。

そしてcol1も要因であるため、実際に、あなたはunique因子を返すことがわかります。

class(unique(d$col1)) 
[1] "factor" 

levelsの戻り値は文字ベクトルで、一方:

class(levels(d$col1)) 
[1] "character" 

したがって、uniqueは空の文字列を二重引用符で囲まずに表示します。代替因子の列なしでDFを定義するには、次のようになります。

d <- data.frame(col1 = c("", 'a', 'b'), stringsAsFactors = F) 

そして、ここでuniqueは確かに「望んでいたが返されます」。もちろんlevels要因のみに適用され、もはや適切ではないだろう:

unique(d$col1) 
[1] "" "a" "b" 
関連する問題