簡體   English   中英

如何更改 data.table 中因子列的級別

[英]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.

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