首页 > 解决方案 > 将列名作为参数传递给 data.table::setkey() --- 某些列不在 data.table: col_name

问题描述

所以,基本上我想要的是类似于这两个帖子:12。但是,当我尝试解决方案时,我不断收到错误消息。

我的问题不同之处在于我正在使用 data.table 包并尝试设置键值。有关更多详细信息,请参见此处

现在,为了举例,假设我有一个数据框并将其键设置如下:

data <- data.table::as.data.table(data.frame(A = c(1, 2, 3), B = c("one", "two", "three")))
 data <- data.table::setkey(data, A)

这行得通。现在,我可以通过其他一些数据结构进行过滤,如下所示:

matches <- data[c(1)]

上面的行将创建一个 data.table,它是data变量A值为 1 的子集。

现在,假设我想让它成为一个通用函数。我无法使以下工作:

genericFunction <- function(data, col_name, filter){
    #Convert data.frame to data.table
    data <- data.table::as.data.table(data)

    #Set the key based on a variable name
    #Error is in this step
    data <- data.table::setkey(data, col_name)

    #Save the subset of data
    matches <- data[c(sorter)]

    return(matches)
}

也就是说,如果我去执行以下操作:

exampleData <- data.frame(A = c(1, 2, 3), B = c("one", "two", "three"))
exampleName <- "A"
exampleFilter <- 1

genericFunction(exampleData, exampleName, exampleFilter)

我收到以下错误:

 Error in setkeyv(x, cols, verbose = verbose, physical = physical) : 
  some columns are not in the data.table: col_name 

我知道我想使用lazyeval::interp() 或类似的东西,但是,上面示例链接中的实现对我不起作用。有人对我应该做什么有任何想法吗?任何帮助表示赞赏。

标签: rdata.tablesubsetnsenon-standard-evaluation

解决方案


不是 data.table 专家,但?setkey说:

setkey(x, ..., verbose=getOption("datatable.verbose"), physical = TRUE)

... - The columns to sort by. Do not quote the column names.

这意味着您不能在此处传递带引号的列名。

您可以使用setkeyv

setkeyv(x, cols, verbose=getOption("datatable.verbose"), physical = TRUE)

cols - A character vector of column names
genericFunction <- function(data, col_name, filter){
  #Convert data.frame to data.table
  data <- data.table::as.data.table(data)
  
  data <- data.table::setkeyv(data, col_name)
  
  #Save the subset of data
  matches <- data[c(filter)]
  
  return(matches)
}

exampleData <- data.frame(A = c(1, 2, 3), B = c("one", "two", "three"))
exampleName <- "A"
exampleFilter <- 1

genericFunction(exampleData, exampleName, exampleFilter)

#   A   B
#1: 1 one

推荐阅读