2014-12-02 3 views
1

Я пытаюсь построить строку поиска для соответствия значениям в таблице данных 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) 

Как я могу получить эту работу , предпочтительно без манипуляции с неудобными строками. Спасибо!

+0

Установить ключ на 'V1, V2 , V3', а затем просто выполните подмножество с бинарным поиском. 'setkey (DT, V1, V2, V3)' (или использовать 'setkeyv'). Затем 'DT [mylist]' где 'mylist = list (« A »,« B »,« C »)'. – Arun

+0

Спасибо @Arun, но это не похоже на то, что мне нужно. Я попытался установить ключ на основе столбцов V1: V3, но когда я подмножу таблицу data.table, он будет соответствовать только элементам списка, которые встречаются в столбце V1. Таким образом, он нашел «A», «B» и «C» в столбце V1, а не «A» в V1, «B» в V2 и «C» в V3. – EPBaron

+0

Пожалуйста, отредактируйте ваше сообщение с помощью примера data.table, вашего списка и вашего кода, чтобы мы могли воспроизвести проблему. Благодарю. – Arun

ответ

1

Это, вероятно, ужасный способ пойти об этом, но это может быть сделано:

txt <- "V1==\"A\" & V2==\"B\" & V3==\"C\"" 
# note - i've removed the last comma from the end of the string 

# example data: 
set.seed(13) 
dt <- data.table(replicate(3,sample(LETTERS[1:3],5,replace=TRUE))) 
dt 

# V1 V2 V3 
#1: C A B 
#2: A B C 
#3: B C C 
#4: A C B 
#5: C A B 

dt[eval(parse(text=txt))] 
# V1 V2 V3 
#1: A B C 

Имейте в виду:

library(fortunes) 
fortune(106) 

Если ответ синтаксического анализа() вы должны обычно переосмысливают вопрос.
- Томас Ламли R-помощь (февраль 2005)

Как @Arun ноты, предпочтительным способом было бы использовать более стандартную data.table функциональность:

setkey(dt,V1,V2,V3) 
mylist <- list("A", "B", "C") 
dt[mylist] 

# V1 V2 V3 
#1: A B C 
+0

Боже мой, это сработало! Я все еще ищу более элегантный способ сделать это, но по крайней мере у меня теперь есть рабочая модель. Спасибо! – EPBaron

Смежные вопросы