所以如果我有一个data.table定义为:
> dt <- data.table (x=c(1,2,3,4), y=c("y","n","y","m"), z=c("pickle",3,8,"egg"))
> dt
x y z
1: 1 y pickle
2: 2 n 3
3: 3 y 8
4: 4 m egg
变量
fn <- "z"
我知道我可以通过以下方式从data.table中提取一列:
> dt[,fn, with=FALSE]
我不知道怎么做的是data.table相当于以下内容:
> factorFunction <- function(df, fn) {
df[,fn] <- as.factor(df[,fn])
return(df)
}
如果我设置fn =“x”并调用factorFunction(data.frame(dt),fn)它就可以了。
所以我尝试使用data.table,但这不起作用
> factorFunction <- function(dt, fn) {
dt[,fn, with=FALSE] <- as.factor(dt[,fn, with=FALSE])
return(dt)
}
sort.list(y)出错:'x'必须是'sort.list'的原子 你有没有在名单上打电话给“排序”?
答案 0 :(得分:4)
你可以尝试
dt[,(fn):= factor(.SD[[1L]]),.SDcols=fn]
如果有多列,请使用lapply(.SD, factor)
将其包装在一个函数中
factorFunction <- function(df, fn) {
df[, (fn):= factor(.SD[[1L]]), .SDcols=fn]
}
str(factorFunction(dt, fn))
#Classes ‘data.table’ and 'data.frame': 4 obs. of 3 variables:
#$ x: num 1 2 3 4
#$ y: chr "y" "n" "y" "m"
#$ z: Factor w/ 4 levels "3","8","egg",..: 4 1 2 3
答案 1 :(得分:3)
与@ akrun的答案相似:
class(dt[[fn]])
#[1] "character"
setFactor <- function(DT, col) {
#change the column type by reference
DT[, c(col) := factor(DT[[col]])]
invisible(NULL)
}
setFactor(dt, fn)
class(dt[[fn]])
#[1] "factor"
答案 2 :(得分:2)
我不推荐这个,因为它非常不合时宜:
factorFunction <- function(df,col){
df[,col] <- factor(df[[col]])
df
}
好处是它可以在基础R和data.table
:
df <- setDF(copy(dt))
class(df[[fn]]) # character
df <- factorFunction(df,fn)
class(df[[fn]]) # factor
class(dt[[fn]]) # character
dt <- factorFunction(dt,fn)
class(dt[[fn]]) # factor