1. ホーム
  2. r

[解決済み】サブセットされたデータフレーム内の未使用の因子レベルを削除する

2022-03-23 20:21:16

質問

を含むデータフレームがあります。 factor . このデータフレームのサブセットを subset または他のインデックス作成関数で、新しいデータフレームが作成されます。 しかし factor 変数は、新しいデータフレームに存在しない場合でも、元のレベルをすべて保持する。

これは、ファセット化されたプロットを行う場合や、因子のレベルに依存する関数を使用する場合に問題が発生します。

新しいデータフレームで因子からレベルを削除する最も簡潔な方法は何ですか?

以下はその例です。

df <- data.frame(letters=letters[1:5],
                    numbers=seq(1:5))

levels(df$letters)
## [1] "a" "b" "c" "d" "e"

subdf <- subset(df, numbers <= 3)
##   letters numbers
## 1       a       1
## 2       b       2
## 3       c       3    

# all levels are still there!
levels(subdf$letters)
## [1] "a" "b" "c" "d" "e"

解決方法は?

サブセットした後、変数に再度 factor() を適用すればよいのです。

> subdf$letters
[1] a b c
Levels: a b c d e
subdf$letters <- factor(subdf$letters)
> subdf$letters
[1] a b c
Levels: a b c

EDIT

ファクターページの例から。

factor(ff)      # drops the levels that do not occur

データフレーム内のすべての要因列からレベルを落とすには、以下を使用します。

subdf <- subset(df, numbers <= 3)
subdf[] <- lapply(subdf, function(x) if(is.factor(x)) factor(x) else x)