web-dev-qa-db-ja.com

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からの構造情報はdf_intrateに実際にASSET CLASS Aの予想される行数であることをR studioが示しているにもかかわらず、なんらかの方法でdf_intrateに保存されていますか?

7
ApplePie

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を再度使用)を使用して、すでに作成されている因子のレベルの順序を変更できます。

4
Gregor Thomas

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

2
LyzandeR

Rにはcharacterクラスとfactorクラスがあります。 characterは、基本的な文字列データ構造です。 factorは統計にとって重要なものです。たとえば、人々が耳たぶの接続性によって分割されるデータセットがある場合があります(重要ですが、一般的に見過ごされている区別です)。このような場合、各人の値はconnectedまたはfreeになります。知能などを耳たぶの接続状態の関数としてモデル化する場合、そのモデルにはconnectedまたはfreeという2つのクラスの人々があることを理解する必要があります。 'dはそれをfactorベクトルとして表し、そのベクトルにはlevelsconnectedfreeの2つがあります。それが意味論的にレベルがRのものである理由です。

構文的には、factor変数とcharacter変数は_as.integer_への応答が異なります。 factor変数は、レベルに対応する数値に変換されますが、character変数は、従来のatoiのように変換されます。一般に、factorであると考えてcharacter変数を操作すると、多くの問題が発生する可能性があります。

私がcsvファイルを読み込んでいるとき、ほとんどの場合、characterよりもfactorsの値が欲しいので、通常はread.csv(..., stringsAsFactor=FALSE)を設定します。 (これがあなたの一般的な好みかどうかに関するYMMV。)

2
flies