2013-06-20 12 views
28

は、次のモックのデータを考える:データフレームから未使用のレベルを削除するにはどうすればよいですか?

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はもう表示したくありません。私はこれを行うにしよう:今0​​が私に与えているので、

levels(y$let) <- factor(y$let) 

I混乱周波数を

b d c e 
0 20 21 40 

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

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

+3

勝利の回答int彼の重複する質問はここの答えほど良くはありません。これは多くの良い答えがあるので、もう一方はこれと重複してマークする必要があります – TheSteve0

答えて

103

Rにおける最近追加された機能は、このためにあります:

y <- droplevels(y) 
17

ちょうどy$let <- factor(y$let)です。既存の因子変数にfactorを実行すると、存在する因子変数にレベルがリセットされます。

1

香港大井の答え、私はR-ブロガーから見here is例に追加します。

# 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) 
関連する問題