使用data.table查找的变量名称和值创建字符串

时间:2014-12-02 05:23:25

标签: r data.table paste

我正在尝试构造一个查找字符串来匹配R data.table中的值。假设我有一个名为myDataTable的data.table,列为V1:V4,列表名为myList,包含3个元素c(“A”,“B”,“C”)。这是我的(公认的不优雅)代码:

# 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输出字符串,它看起来像这样:

cat(matchstr)
V1=="A" & V2=="B" & V3=="C",

我想将它用作data.table的查找字符串,如下所示:

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)

我怎样才能让它工作,最好没有笨拙的字符串操作。 谢谢!

1 个答案:

答案 0 :(得分: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-help(2005年2月)

正如@Arun所说,首选方法是使用更多标准data.table功能:

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

#   V1 V2 V3
#1:  A  B  C