将列名作为参数传递给 data.table::setkey() --- 某些列不在 data.table 中:col_name
Passing Column Name as Parameter to data.table::setkey() --- some columns are not in the data.table: col_name
所以,基本上我想要的与这两篇文章类似:, 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, 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() 或类似的东西,但是,上面示例链接中的实现对我不起作用。有没有人对我应该做什么有任何想法?感谢您的帮助。
不是 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
所以,基本上我想要的与这两篇文章类似:
我的问题有何不同之处在于,我使用的是 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, 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() 或类似的东西,但是,上面示例链接中的实现对我不起作用。有没有人对我应该做什么有任何想法?感谢您的帮助。
不是 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