如何使用R语言data.table包的:=操作符原地将指定列转换为factor类型
如何用data.table的
:=原地转换指定列为factor类型 原来的拆分-合并方法确实有点繁琐,用data.table的:=原地赋值操作符可以一步搞定,而且完全不影响其他列的类型。这里有两种更简便的实现方式:
方式一:通过列索引指定要转换的列
如果你清楚要转换的是第1、2、4、6、7列,可以直接用列索引操作:
library("data.table") titanic <- fread("titanic.csv") # 原地将指定列转为factor,保留原有唯一值作为levels titanic[, c(1,2,4,6,7) := lapply(.SD, factor, levels = unique(.SD)), .SDcols = c(1,2,4,6,7)]
这段代码的逻辑很清晰:
.SDcols用来筛选出需要处理的列;lapply(.SD, factor, levels = unique(.SD))把这些列逐个转成factor,并且用列本身的唯一值作为levels(和你原来的逻辑完全一致);- 最后通过
:=直接把转换后的结果赋值回原表的对应列,全程原地修改,不需要额外创建临时表。
方式二:通过列名指定更直观
如果担心数错列索引,用列名指定会更稳妥,可读性也更强:
library("data.table") titanic <- fread("titanic.csv") # 定义要转换为factor的列名 cols_to_factor <- c("Survived", "Pclass", "Sex", "Siblings/Spouses Aboard", "Parents/Children Aboard") # 原地转换指定列 titanic[, (cols_to_factor) := lapply(.SD, factor, levels = unique(.SD)), .SDcols = cols_to_factor]
这里要注意:列名变量需要用括号()包裹,这样data.table才会识别出这是要赋值的目标列,而不是创建一个新的名为cols_to_factor的列。
不管用哪种方式,处理完后你可以用str(titanic)验证:指定的列已经变成factor类型,而Name、Age、Fare这些列的类型完全没有变化,完美满足你的需求。
内容的提问来源于stack exchange,提问作者Zzx Zhang
相关产品推荐
相关产品推荐

