【问题标题】:Modify data.table column class within a function在函数中修改 data.table 列类
【发布时间】:2016-06-01 17:26:05
【问题描述】:

我将列名作为字符串传递给函数,并希望更改相应列的类。目前,我使用 get(varName) 引用 data.table 的列。

我有一个带有因子列的 data.table,我希望将其转换为字符。样本数据:

dt <- data.table(factor(c("b","c")),foo=c(4,2))
sapply(dt, class)

简化尝试:

fo2 <- function(data, change){
  data[,get(change):=as.character(get(change))]
  return(data)
}

fo2(data=dt, change="V1")

Error in get(change) : object 'V1' not found

感谢您的帮助理解。

【问题讨论】:

标签: r function data.table


【解决方案1】:

您不需要在左侧使用get。您可以将功能更改为:

fo2 <- function(data, change){
  data[, (change) := as.character(get(change))][]
}

使用您的示例数据,它看起来像这样:

dt <- data.table(factor(c("b","c")),foo=c(4,2))
sapply(dt, class)
#       V1       foo 
# "factor" "numeric" 
fo2(data=dt, change="V1")
#   V1 foo
#1:  b   4
#2:  c   2
str(dt)
#Classes ‘data.table’ and 'data.frame': 2 obs. of  2 variables:
# $ V1 : chr  "b" "c"
# $ foo: num  4 2
# - attr(*, ".internal.selfref")=<externalptr> 

【讨论】:

  • 或喜欢set(DT, j=change, v=as.character(DT[[change]]))。对于那些不习惯它的人来说,它可能无法交互使用,但 OP 会将它扔进一个函数中。
【解决方案2】:

我相信这样做可以:

dt <- data.table(factor(c("b","c")),foo=c(4,2),char=c("X","Y"))

change <- c("V1", "char")

dt[, change] <- dt[, lapply(.SD, as.character), .SDcols = change]

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2020-10-02
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2015-10-15
    相关资源
    最近更新 更多