[英]conversion error from numeric to factor in raster: Error in 1:ncol(r) : argument of length 0, r command: as.factor()
[英]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
如果您嘗試直接從一個因子轉換為一個數字,您將看到一個數字向量,但不是您的原始值,您將看到每個值匹配的級別。 例如,第一個級別2001
與Year
中的前三個值匹配,因此您將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 如何轉換數據類型,三種常見的類型是numeric
、 character
和factor
。 到目前為止(在我看來)因素是來自其他語言的最不直觀的。
我喜歡將因素視為“類別”。 它們沒有順序(與可以按字母順序排列的字符不同)。 它們是用於列出內容的抽象數據類型。 其他人可能不同意這種解釋,但這有助於我理解。
我說因素沒有順序,好吧,為了簡單起見,這是一種謊言。 事實證明, 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.