2017-10-19 7 views
0

これは非常に基本的な質問ですが、どのレベルがRで意味するのか分かりません。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_intrateを示すRスタジオにもかかわらず、何とかdf_intrateに保存dfからの構造情報が確かASSET CLASS Aためと予想される行数ですされていますか?

+0

'read.csv(path、as.is = TRUE)'を使用すると、因子列の代わりに文字列が得られることに注意してください。 'header = TRUE'と' sep = "、" 'は' read.csv'のデフォルト値なので、指定する必要はありません。 –

答えて

1

あなたはfactor呼ばRにデータ構造にLevelsを参照してください。因子は整数型です:

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]です。

1

Rは、characterクラスおよびfactorクラスを有する。 characterは基本的な文字列データ構造です。 factorは統計にとって重要なものです。たとえば、人が耳たぶのつながりで分けられたデータセットがあるかもしれません。このような場合、各人の値はconnectedまたはfreeとなります。あなたは耳たぶの接続状態の関数として、たとえば、知性をモデル化した場合、あなたは2つのクラスがあることを理解して、そのモデルをしたいと思います:connectedまたはfreeは、あなたが表現したいことfactorベクトルとして、およびそのベクトルは2つのlevelsconnectedfreeを持つでしょう。レベルが構文的にR.

での事である理由だから、意味的だ、factorcharacter変数が異なっas.integerに応答します。 factor変数はレベルに対応する数値に変換されますが、character変数は従来のatoiのように変換されます。一般に、factor変数を操作している場合は、それがcharacterだと思うと、多くの問題に遭遇する可能性があります。

私はCSVファイルを読み込んでいるときに、ほとんどの場合、characterの値がfactorsよりもむしろに設定されていることがわかります。 (これがあなたの一般的な好みであるかどうかについては、YMMV。)

2

df_intrateが実際にASSETクラスAの予想行数であることをRスタジオが示しているにもかかわらず、df_intrateに構造情報が保持されていますか?

はい。これは、要因呼ばRに格納されているか、カテゴリ変数である - 両方レベル、すべての可能な値のベクトルと、撮影した実際の値が格納されている:あなたは取り除くことができ

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再び)を使用することができます。

関連する問題