将列名作为参数传递给data.table :: setkey---有些列不在data.table中:col_name

问题描述

因此,从本质上讲,我想要的是与以下两个帖子类似的内容12。但是,当我尝试解决方案时,总是出现错误

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

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

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,"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()或类似的东西,但是,上面示例链接中的实现对我不起作用。有人对我应该做什么有任何想法吗?任何帮助表示赞赏。

解决方法

不是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,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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...