2017-10-19 114 views
0

我明白這是一個非常基本的問題,但我不明白是什麼水平R.R是什麼水平?

供參考的意思是,我做了一個簡單的腳本來讀取CSV表,過濾器的領域之一,在通過這到一個新變量並清除爲第一個變量分配的內存。如果我在過濾的字段上調用unique(),我發現結果確實被過濾了,但是還有一行顯示與原始數據集中的數據相對應的「級別」。

例子:

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儘管表明df_intrate [R工作室是ASSET CLASS A行的確預計是多少?

+0

請注意,如果您使用'read.csv(path,as.is = TRUE)',那麼您將獲得字符列代替因子列。還要注意'header = TRUE'和'sep =',''''是'read.csv'的默認值,所以你不必指定它們。 –

回答

1

您在R的數據結構中看到Levels,調用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]

1

R有character類和factor類。 character是您的基本字符串數據結構。 factor對於統計來說很重要:例如,您可能有一個數據集,人們被耳垂的連通性劃分(一個重要但常被忽視的區別)。在這種情況下,對於每個人,他們將具有值connectedfree。如果您將模型(例如智能)作爲耳垂連接狀態的函數,那麼您希望該模型瞭解有兩類人:connectedfree,因此您將其表示爲factor矢量,並且該載體將具有兩個levelsconnectedfree。所以這是語義爲什麼水平在R.一件事

在語法上,factorcharacter變量as.integer不同的反應。 factor變量轉換爲與其級別相對應的數字,而character變量更像傳統的atoi。一般來說,如果您使用factor變量進行操作,您會遇到很多問題,因爲它是character

當我在閱讀csv文件時,在大多數情況下,我發現我寧願有character的值比factors,所以我通常設置read.csv(..., stringsAsFactor=FALSE)。 (YMMV至於這是否是您的一般偏好。)

2

儘管R studio顯示df_intrate確實是ASSET CLASS A的預期行數,但df_intrate中是否保留了df的結構信息?

是的。這是變量是如何分類的,被稱爲因素,被存入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再次)更改級別的順序對已創建的因素。