如何更改data.table中的因子列的级别

什么是正确的方法来更改data.table中的factor列的data.table (注意:不是数据框)

  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是非常大的,因为传统的语法复制整个对象。 你也可以玩un-factoring和refactoring游戏,但是没有人喜欢那个游戏。

要通过引用更改级别而不使用mydt副本:

 setattr(mydt$value,"levels",c(...)) 

但一定要分配一个有效的水平vector(typescharacter的长度足够),否则你会最终得到一个无效的因素( levels<-做一些检查以及复制)。

我宁愿采用传统的重新分配方式

 > mydt$value # This we what we had originally [1] AABBBC Levels: ABC > 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 

正如你可能注意到的那样, 重新分配的内容是非常直观的,它会检查确切的级别(如果存在模糊math,正则expression式或类似情况,则使用grepl)

(mydt $ value)[levels(mydt $ value)==“A”] < – “X” 明确地检查所考虑的variables的“levels”中的值,然后重新赋值“X”(依此类推)对它 – 好处 – 你明确知道什么标签。

我发现这里的重命名级别(mydt $ value)< – c(“X”,“Y”,“Z”)非常不直观 ,因为它只是将X赋值给数据中的第一个级别订单真的很重要)

PPS:如果层次太多,请使用循环结构。

您也可以使用相关的方法重新命名和添加到您的关卡中,这可以非常方便,特别是在制作需要更多信息标签的情节时(与默认情况相反):

 f <- factor(c("a","b")) levels(f) <- list(C = "C", D = "a", B = "b") 

(从?levels修改)

最简单的方法来更改列的级别:

dat$colname <- as.factor(as.vector(dat$colname));