6

5 つの因子水準を持つ複数の変数を持つデータ フレームがあります。それらのレベルの 1 つだけを削除したい。まず、そのレベルのすべてのインスタンスを NA に割り当ててから、droplevelsコマンドを使用して空のレベルを取り除きました。

ただし、データ フレーム内の 1 つの変数については、削除したくないレベルの 1 つに観測値がありません。空の要素だけでなく、特定の要素レベルのみを削除する方法はありますか?

ここに再現可能な例があります

df <- data.frame(var1=rep(letters[1:5],2),var2=rep(letters[5:1],2),var3=c("a","c","d","e","a","c","d","e","a","c"))
levels(df$var3)<-c("a","c","d","e","b")

これにより、私のようなデータフレームが設定されます。ここで、レベル e のすべてのインスタンスを削除し、可能なレベルとしてドロップします。以下のコードでこれを行います。

df2<-replace(df, df=="e",NA)
df2<-droplevels(df2)

問題は、それを使用するdroplevelsと、var3 からレベル b もドロップされることです。すべての変数からレベル b だけを削除したくありません。特定のレベルだけを削除する方法を探しましたが、答えが見つかりませんでした。特定の因子レベルだけを削除する方法を教えてもらえますか? 私が理想的に望むのは、droplevelsレベル e を削除するように指示できるコマンドです。そのような機能は存在しますか?

4

2 に答える 2

8
str(
  as.data.frame(
    lapply(
      df2, 
      function(x) factor(as.character(x), levels=levels(x)[levels(x) != "e"])
) ) )
# 'data.frame':  10 obs. of  3 variables:
# $ var1: Factor w/ 4 levels "a","b","c","d": 1 2 3 4 NA 1 2 3 4 NA
# $ var2: Factor w/ 4 levels "a","b","c","d": NA 4 3 2 1 NA 4 3 2 1
# $ var3: Factor w/ 4 levels "a","c","d","b": 1 2 3 NA 1 2 3 NA 1 2
于 2014-01-03T22:05:14.130 に答える
0

droplevels関心のある因子列だけを使用しない理由がわかりません:

df2$var2 <- droplevels(df2$var2)

> lapply(df2, levels)
$var1
[1] "a" "b" "c" "d" "e"

$var2
[1] "a" "b" "c" "d"

$var3
[1] "a" "c" "d" "e" "b"

説明:droplevelsは一般的であり、ファクター オブジェクトとデータフレーム オブジェクトの両方のメソッドがあります。

> methods(droplevels)
[1] droplevels.data.frame droplevels.factor    
于 2014-01-03T22:24:24.153 に答える