如何更改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));