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