问题描述
因此,从本质上讲,我想要的是与以下两个帖子类似的内容:1,2。但是,当我尝试解决方案时,总是出现错误。
我的问题与众不同之处是我正在使用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