web-dev-qa-db-ja.com

データフレームから未使用のレベルを削除するにはどうすればよいですか?

次の模擬データがあるとします。

_set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T), 
                num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')
_

_y$let_のテーブルを作成すると、結果が得られます

_a  b  c  d  e 
0 20 21 22 18
_

しかし、aをもう表示したくありません。これをしようとすると:

_levels(y$let) <- factor(y$let)
_

table(y$let)が私に与えるので、周波数を台無しにします

_b  d  c  e 
0 20 21 40 
_

私はxtabs(~ y$let, drop.unused.levels = T)を実行して問題を回避できることを知っていますが、そのコアで変数レベルをリセットしません(これは私にとって重要なことです。分析全体を通して実行されるデータセット)。さらに、xtabstableとは異なるクラスであり、プロジェクトの後半で頭痛の種になります。

問題は、サブセットを作成したときにドロップされたレベルが表示されないようにlevels(y$let)を自動的に変更するにはどうすればよいですか?この場合、どのように_[1] "b" "c" "d" "e"_を表示させることができますか?

39
Waldir Leoncio

このためにRに最近追加された関数があります。

y <- droplevels(y)
115
Señor O

y$let <- factor(y$let)を実行してください。既存の因子変数でfactorを実行すると、レベルは存在するレベルのみにリセットされます。

21
Hong Ooi

Hong Ooiの答えに加えて、 ここにあります R-Bloggersで見つけた例です。

# Create some fake data
x <- as.factor(sample(head(colors()),100,replace=TRUE))
levels(x)
x <- x[x!="aliceblue"]
levels(x) # still the same levels
table(x) # even though one level has 0 entries!

The solution is simple: run factor() again:
x <- factor(x)
levels(x)
2
OmegaSupreme