Я пытаюсь построить строку поиска для соответствия значениям в таблице данных R. Скажем, у меня есть data.table с именем myDataTable с столбцами V1: V4 и списком с именем myList с 3 элементами c («A», «B», «C»). Вот мой (правда, безвкусный) Код:Создайте строку с именами переменных и значениями для поиска data.table
# create first value
matchstr <- paste('V1', '=="', myList[1], '"', sep="")
# construct rest of match string
for (i in 2:length(myList)) {
matchstr <- paste(matchstr, ' & V', i, '=="', myList[i], '"', sep="")
}
matchstr <- paste(matchstr, ",", sep="")
Моя строка матча теперь выглядит следующим образом:
matchstr
[1] "V1==\"A\" & V2==\"B\" & V3==\"C\","
Если я использую кошку для вывода строки, это выглядит следующим образом:
cat(matchstr)
V1=="A" & V2=="B" & V3=="C",
Я хочу использовать это как строку поиска для своих данных. Таблицы, например:
myDataTable[V1=="A" & V2=="B" & V3=="C",]
Если я сделаю это с показанным текстом, я получу ожидаемый результат. Но если я пытаюсь что-то вроде этого:
myDataTable[matchstr]
Я получаю
Error in `[.data.table`(wordTable, matchstr) :
When i is a data.table (or character vector), x must be keyed (i.e. sorted,
and, marked as sorted) so data.table knows which columns to join to and take
advantage of x being sorted. Call setkey(x,...) first, see ?setkey.
Если я пытаюсь
myDataTable[cat(matchstr)]
Я получаю
V1=="A" & V2=="B" & V3=="C",Null data.table (0 rows and 0 cols)
Как я могу получить эту работу , предпочтительно без манипуляции с неудобными строками. Спасибо!
Установить ключ на 'V1, V2 , V3', а затем просто выполните подмножество с бинарным поиском. 'setkey (DT, V1, V2, V3)' (или использовать 'setkeyv'). Затем 'DT [mylist]' где 'mylist = list (« A »,« B »,« C »)'. – Arun
Спасибо @Arun, но это не похоже на то, что мне нужно. Я попытался установить ключ на основе столбцов V1: V3, но когда я подмножу таблицу data.table, он будет соответствовать только элементам списка, которые встречаются в столбце V1. Таким образом, он нашел «A», «B» и «C» в столбце V1, а не «A» в V1, «B» в V2 и «C» в V3. – EPBaron
Пожалуйста, отредактируйте ваше сообщение с помощью примера data.table, вашего списка и вашего кода, чтобы мы могли воспроизвести проблему. Благодарю. – Arun