[英]How does one change the levels of a factor column in a data.table
更改data.table
factor
列級別的正確方法是什么(注意:不是數據框)
library(data.table)
mydt <- data.table(id=1:6, value=as.factor(c("A", "A", "B", "B", "B", "C")), key="id")
mydt[, levels(value)]
[1] "A" "B" "C"
我正在尋找類似的東西:
mydt[, levels(value) <- c("X", "Y", "Z")]
但是當然,上面的行不起作用。
# Actual # Expected result
> mydt > mydt
id value id value
1: 1 A 1: 1 X
2: 2 A 2: 2 X
3: 3 B 3: 3 Y
4: 4 B 4: 4 Y
5: 5 B 5: 5 Y
6: 6 C 6: 6 Z
您仍然可以以傳統方式設置它們:
levels(mydt$value) <- c(...)
這應該足夠快,除非mydt
非常大,因為傳統語法復制了整個對象。 你也可以玩非分解和重構游戲……但無論如何沒人喜歡那個游戲。
要在沒有mydt
副本的情況下通過引用更改級別:
setattr(mydt$value,"levels",c(...))
但一定要分配一個有效的級別向量(足夠長度的類型character
),否則你最終會得到一個無效的因子( levels<-
做一些檢查和復制)。
我寧願采用重新分配因子的傳統方式
> mydt$value # This we what we had originally
[1] A A B B B C
Levels: A B C
> levels(mydt$value) # just checking the levels
[1] "A" "B" "C"
**# Meat of the re-assignment**
> levels(mydt$value)[levels(mydt$value)=="A"] <- "X"
> levels(mydt$value)[levels(mydt$value)=="B"] <- "Y"
> levels(mydt$value)[levels(mydt$value)=="C"] <- "Z"
> levels(mydt$value)
[1] "X" "Y" "Z"
> mydt # This is what we wanted
id value
1: 1 X
2: 2 X
3: 3 Y
4: 4 Y
5: 5 Y
6: 6 Z
正如您可能注意到的那樣,重新分配的內容非常直觀,它檢查確切的level
(如果存在模糊數學、正則表達式或grepl
情況,請使用grepl
)
levels(mydt$value)[levels(mydt$value)=="A"] <- "X"
這會明確檢查所考慮變量的levels
中的值,然后將X
(依此類推)重新分配給它 -優勢 - 您明確知道什么標記了什么。
我發現將級別重命名為這里levels(mydt$value) <- c("X","Y","Z")
非常不直觀,因為它只是將X
分配給它在數據中看到的第一級(所以順序真的很重要)
PPS:如果級別過多,請使用循環結構。
您還可以使用相關方法重命名和添加到您的級別,這可能非常方便,特別是如果您正在制作需要以特定順序(而不是默認順序)提供更多信息標簽的繪圖:
f <- factor(c("a","b"))
levels(f) <- list(C = "C", D = "a", B = "b")
(修改自?levels
)
這比 Matt Dowle 的建議更安全(因為它使用 setattr 跳過的檢查)但不會復制整個 data.table。 它將替換整個列向量(而 Matt 的解決方案只替換列向量的屬性),但這似乎是一個可以接受的權衡,以減少弄亂因子對象的風險。
mydt[, value:=`levels<-`(value, c("X", "Y", "Z"))]
更改列級別的最簡單方法:
dat$colname <- as.factor(as.vector(dat$colname));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.