簡體   English   中英

as.factor() 在數字轉換 R

[英]as.factor() in numeric conversion R

所以我現在正在學習 R,我從許多來源注意到,每當我們想要將數據類型轉換為數字時,我們都會使用兩個函數as.numeric()as.factor()

例如,如果我想將列 Year 轉換為數字,它將是

as.numeric(as.factor(survey.data$Year))

我嘗試單獨使用as.numeric()並且它也很完美。 但我覺得我以這種方式錯過了某些東西。 我只是想知道首先轉換為 Factor ,然后轉換為 Numeric 的原因是什么?

謝謝。

如果你想把 Year 列轉換成數字,也許你想到的是將一個因子轉換成數字的必要過程,通過這個過程你必須先轉換成一個字符。

您可以對數據框執行相同的操作並對列進行子集化,但在這里我創建了一個簡單的示例:

#Create a factor vector called Year with 3 levels
    Year <- factor(c(2001, 2001, 2001, 2004, 2004, 2020, 2020))
    Year
    [1] 2001 2001 2001 2004 2004 2020 2020
    Levels: 2001 2004 2020 

如果您嘗試直接從一個因子轉換為一個數字,您將看到一個數字向量,但不是您的原始值,您將看到每個值匹配的級別。 例如,第一個級別2001Year中的前三個值匹配,因此您將1 1 1視為數字向量中的前三個值:

#Incorrect: convert Year into numeric directly
    nope.Year <- as.numeric(Year)
    nope.Year
    [1] 1 1 1 2 2 3 3

要將因子正確轉換為數字並真正返回原始向量值,請先轉換為字符,然后轉換為數字,您可以使用嵌套函數執行此操作,因為 R 從最內層括號開始並向外作為操作順序:

#Correct: convert Year into a character, then into numeric
    num.Year <- as.numeric(as.character(Year))
    num.Year
    [1] 2001 2001 2001 2004 2004 2020 2020

值得注意的是,如果您使用的是舊版本的 R(4.0 之前),那么當您使用data.frame()read.table()變體時,R 默認將您的字符串轉換為因子,除非您指定參數在這些函數中的每一個中, stringsAsFactors = FALSE 如果您沒有指定stringsAsFactors = FALSE ,那么您將必須經歷將您的因子轉換為字符然后轉換為數字的過程。

如果您使用的是 R 的后續版本(4.0 或更高版本),當您使用這些函數或其變體時,R 不再自動將字符串轉換為因子,因為現在默認參數是stringsAsFactors = FALSE ,我們都可以慶祝。

我不認為你在這里遺漏了任何東西。 要理解的主要內容是 R 如何轉換數據類型,三種常見的類型是numericcharacterfactor 到目前為止(在我看來)因素是來自其他語言的最不直觀的。

我喜歡將因素視為“類別”。 它們沒有順序(與可以按字母順序排列的字符不同)。 它們是用於列出內容的抽象數據類型。 其他人可能不同意這種解釋,但這有助於我理解。

我說因素沒有順序,好吧,為了簡單起見,這是一種謊言。 事實證明, Factors 也有levels 級別列出了事物的順序。 假設我們有一個向量

animals <- factor(c("Rabbit", "Cat", "Dog"))

如果我們使用levels(animals)檢查它的等級,它將按順序返回"Cat" "Dog" "Rabbit" 這是因為我們將向量創建為字符,因此默認的“級別順序”是按字母順序排列的。

我們可以通過我不會在這里介紹的方式更改這些級別順序,但是如果您希望 Rabbit 成為第一級,則需要手動設置。 這意味着您可以為這些抽象變量創建順序。

如果我們使用

as.numeric(animals)

這將導致c(3, 1, 2) 那是因為 numeric 將因子轉換為指示其級別順序的整數。

如果你想轉換一個因子,說“1”到數字 1,你必須先把它轉換成一個字符,然后是一個數字。

這是因為因子和整數之間的轉換具有這種行為。 但是從因子到字符的轉換會去掉構成因子的字母。 然后從字符到數字的轉換將數字字符轉換為實際數字。

所以回到你的例子,我認為只使用as.numeric就可以了,除非你想得到代表因子水平順序的數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM