次の模擬データがあるとします。
_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)
を実行して問題を回避できることを知っていますが、そのコアで変数レベルをリセットしません(これは私にとって重要なことです。分析全体を通して実行されるデータセット)。さらに、xtabs
はtable
とは異なるクラスであり、プロジェクトの後半で頭痛の種になります。
問題は、サブセットを作成したときにドロップされたレベルが表示されないようにlevels(y$let)
を自動的に変更するにはどうすればよいですか?この場合、どのように_[1] "b" "c" "d" "e"
_を表示させることができますか?
このためにRに最近追加された関数があります。
y <- droplevels(y)
y$let <- factor(y$let)
を実行してください。既存の因子変数でfactor
を実行すると、レベルは存在するレベルのみにリセットされます。
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)