Передача имени столбца в качестве параметра в data.table :: setkey (), некоторые столбцы отсутствуют в data.table: col_name

Итак, по сути то, что я хочу, похоже на эти два сообщения: 1, 2. Однако, когда я пробую решения, я продолжаю получать сообщение об ошибке.

Моя проблема отличается тем, что я использую пакет 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 () или что-то в этом роде, однако реализации в приведенных выше примерах ссылок не работают для меня. Есть ли у кого-нибудь идеи, что мне делать? Любая помощь приветствуется.


person Max Black    schedule 05.11.2020    source источник


Ответы (1)


Не эксперт по таблицам данных, но ?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
person Ronak Shah    schedule 05.11.2020