これは非常に基本的な質問であることは理解していますが、Rでのレベルの意味がわかりません。
参考までに、CSVテーブルを読み取り、フィールドの1つでフィルタリングし、これを新しい変数に渡し、最初の変数に割り当てられたメモリをクリアする簡単なスクリプトを実行しました。フィルタリングしたフィールドでunique()を呼び出すと、結果は実際にフィルタリングされたことがわかりますが、元のデータセット内のデータに対応する「レベル」を示す1行が追加されています。
例:
df = read.csv(path, sep=",", header=TRUE)
df_intrate = df[df$AssetClass == "ASSET CLASS A", ]
rm(df)
gc()
unique(df_intrate$AssetClass)
結果:
[1] ASSET CLASS A
Levels: ASSET CLASS E ASSET CLASS D ASSET CLASS C ASSET CLASS B ASSET CLASS A
df
からの構造情報はdf_intrateに実際にASSET CLASS A
の予想される行数であることをR studioが示しているにもかかわらず、なんらかの方法でdf_intrateに保存されていますか?
R studioがdf_intrateが実際にASSET CLASS Aの予想される行数であることを示しているにもかかわらず、dfからの構造情報はなんらかの方法でdf_intrateに保存されていますか?
はい。これは、カテゴリ変数factorsがRに格納される方法です-すべての可能な値のベクトルであるlevelsと取得された実際の値の両方が格納されます。
_x = factor(c('a', 'b', 'c', 'a', 'b', 'b'))
x
# [1] a b c a b b
# Levels: a b c
y = x[1]
# [1] a
# Levels: a b c
_
droplevels()
を使用するか、factor
関数を再適用して未使用のレベルを削除し、存在するものだけから新しい要素を作成できます。
_droplevels(y)
# [1] a
# Levels: a
factor(y)
# [1] a
# Levels: a
_
データフレームでdroplevels
を使用して、すべての因子列からすべての未使用レベルを削除することもできます。
_dat = data.frame(x = x)
str(dat)
# 'data.frame': 6 obs. of 1 variable:
# $ x: Factor w/ 3 levels "a","b","c": 1 2 3 1 2 2
str(dat[1, ])
# Factor w/ 3 levels "a","b","c": 1
str(droplevels(dat[1, ]))
# Factor w/ 1 level "a": 1
_
現在の問題とは無関係ですが、factor
にはオプションのlevels
引数があり、因子のレベルとそれらが進む順序を指定するために使用できることにも言及する必要があります。これは、特定の順序が必要な場合(たとえば、プロットやモデリングの場合)、または実際に存在するレベルよりも多くのレベルがあり、それらを含めたい場合に役立ちます。 levels
を指定しない場合、デフォルトはアルファベット順になります。
_x = c("agree", "disagree", "agree", "neutral", "strongly agree")
factor(x)
# [1] agree disagree agree neutral strongly agree
# Levels: agree disagree neutral strongly agree
## not a good order
factor(x, levels = c("disagree", "neutral", "agree", "strongly agree"))
# [1] agree disagree agree neutral strongly agree
# Levels: disagree neutral agree strongly agree
## better order
factor(x, levels = c("strongly disagree", "disagree", "neutral", "agree", "strongly agree"))
# [1] agree disagree agree neutral strongly agree
# Levels: strongly disagree disagree neutral agree strongly agree
## good order, more levels than are actually present
_
_?reorder
_および_?relevel
_(または単にfactor
を再度使用)を使用して、すでに作成されている因子のレベルの順序を変更できます。
Levels
と呼ばれるRのデータ構造にfactor
が表示されます。因子は整数型です:
typeof(as.factor(letters))
#[1] "integer"
ただし、これらにはラベルがあり、各整数を文字指定(ラベル)にマップします。係数は通常、アルゴリズムが数値を必要とするモデル(時にはダミー変数の形式)で役立ちますが、モデルの解釈中に人間にとってより意味のあるラベルを維持することがわかります。
レベルはベクトルの属性です。
attributes(as.factor(letters))
#$levels
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
#[18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
#$class
#[1] "factor"
つまり、列をASSET CLASS A
のみにサブセット化すると、列の属性も転送されます。これはベクターの長さとは関係ありませんが、ベクターの長さは[1]
のままです。
Rにはcharacter
クラスとfactor
クラスがあります。 character
は、基本的な文字列データ構造です。 factor
は統計にとって重要なものです。たとえば、人々が耳たぶの接続性によって分割されるデータセットがある場合があります(重要ですが、一般的に見過ごされている区別です)。このような場合、各人の値はconnected
またはfree
になります。知能などを耳たぶの接続状態の関数としてモデル化する場合、そのモデルにはconnected
またはfree
という2つのクラスの人々があることを理解する必要があります。 'dはそれをfactor
ベクトルとして表し、そのベクトルにはlevels
とconnected
とfree
の2つがあります。それが意味論的にレベルがRのものである理由です。
構文的には、factor
変数とcharacter
変数は_as.integer
_への応答が異なります。 factor
変数は、レベルに対応する数値に変換されますが、character
変数は、従来のatoi
のように変換されます。一般に、factor
であると考えてcharacter
変数を操作すると、多くの問題が発生する可能性があります。
私がcsvファイルを読み込んでいるとき、ほとんどの場合、character
よりもfactors
の値が欲しいので、通常はread.csv(..., stringsAsFactor=FALSE)
を設定します。 (これがあなたの一般的な好みかどうかに関するYMMV。)