【问题标题】:R: How to write a function that gets the levels of column in a data.tableR:如何编写一个函数来获取 data.table 中列的级别
【发布时间】:2014-01-06 00:09:10
【问题描述】:

一些数据:

require(data.table)
set.seed(123)
DT <- data.table(factor = c("a", "b", "c"), num = rpois(6, 30))
DT[["factor"]] <- factor(DT[["factor"]])
levels(DT[["factor"]])
# [1] "a" "b" "c"

我正在尝试编写一个获取 DT 级别的函数。到目前为止,这是我尝试过的:

get_levels <- function(data, factor){
  data = substitute(data)
  factor = substitute(factor)
  factor_levels = levels(data[["factor"]])
  print(factor_levels)
}

get_levels(DT, factor)

get_levels2 <- function(data, factor){
  data = substitute(data)
  factor = substitute(factor)
  factor_levels = levels(data[[factor]])
  print(factor_levels)
}

get_levels2(DT, factor)


get_levels3 <- function(data, factor){
  data = substitute(data)
  factor = substitute(factor)
  factor_levels = levels(eval(data[[deparse(factor)]]))
  print(factor_levels)
}

get_levels3(DT, factor)

我收到此错误:

Error in data[["factor"]] : object of type 'symbol' is not subsettable

还有这个:

Error in data[[deparse(factor)]] : 
  object of type 'symbol' is not subsettable

由于我没有太多编程经验,我不知道用于在函数中传递变量的函数的确切用途是什么:substitutedeparseevalparse。我一直在阅读文档,但我发现它不是很清楚。因此,如果有人可以为每个功能提供更清晰的用途,或者可能指向资源以了解更多信息,那将会很有趣。

【问题讨论】:

  • DT[["factor"]] &lt;- factor(DT[["factor"]]) 不是惯用的方式。它会复制你的data.table。做DT[, factor := factor(factor)]。一般来说,使用已知函数作为变量/列名是不明智的。
  • 我看到现在很混乱。我会试试这个和乔兰的答案。感谢您的帮助!

标签: r data.table r-factor


【解决方案1】:

如果您没有 R(或一般编程)经验,请避免使用 substitutedeparseeval 等。它们很少需要。

DT <- data.table(f = c("a", "b", "c"), num = rpois(6, 30))
DT[["f"]] <- factor(DT[["f"]])

get_levels <- function(data,fac){
  levels(data[[fac]])
}

get_levels(DT,'f')

不要将您的专栏称为factor。那是一个函数,只是令人困惑。

【讨论】:

    【解决方案2】:

    以下打印出数据集中每个因子列的级别数:

    sapply(sapply(DT[,sapply(DT, is.factor)], levels), length)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多