2016-09-18 7 views
5

के साथ गैर-इक्विटी कैसे जुड़ें मैं एक परिवर्तनीय कॉलम नाम के साथ data.table 1.9.7 में गैर-इक्विटी कैसे शामिल कर सकता हूं? उदाहरण के लिए,वेरिएबल कॉलम नाम

ज्ञात स्तंभ नाम:

library(data.table) 
dt <- data.table(x=round(rnorm(10)), y=rnorm(10)) 
binDT <- data.table(LB=c(-Inf, -1, 0, .2, .7, 1.5, 3), RB=c(-1, 0, .2, .7, 1.5, 3, Inf)) 
dt[binDT, on=.(x>=LB, x<RB)] 
     x  y x.1 
1: -Inf 2.2669 -1.0 
2: -1.0 -0.5453 0.0 
3: -1.0 0.5125 0.0 
4: 0.0 1.4151 0.2 
5: 0.0 -0.1440 0.2 
6: 0.0 -1.1802 0.2 
7: 0.0 0.3338 0.2 
8: 0.0 -1.8220 0.2 
9: 0.2  NA 0.7 
10: 0.7 0.3155 1.5 
11: 0.7 -0.6284 1.5 
12: 1.5  NA 3.0 
13: 3.0  NA Inf 

चर स्तंभ नाम:

colName <- "x" 
dt[binDT, on=.(get(colName)>=LB, get(colName)<RB)] # Error 
dt[binDT, on=eval(parse(text="list(x>=LB, x<RB)"))] # Error 

उत्तर

7

@ आकार का जवाब ठीक है, लेकिन इसे हासिल करने का एक आसान तरीका है। on तर्क चरित्र वेक्टर ले सकता है, इसलिए यह अपेक्षित कॉलम और ऑपरेटरों को चिपकाने का मामला हो सकता है।

colName="x" 
on=sprintf(c("%s>=LB","%s<RB"), colName) 
print(on) 
#[1] "x>=LB" "x<RB" 
dt[binDT, on=on] 
#  x   y x.1 
# 1: -Inf   NA -1.0 
# 2: -1.0 0.48127355 0.0 
# 3: 0.0 0.11779604 0.2 
# 4: 0.0 -0.97891522 0.2 
# 5: 0.0 -0.05969859 0.2 
# 6: 0.0 -0.05625401 0.2 
# 7: 0.2   NA 0.7 
# 8: 0.7 -0.84438216 1.5 
# 9: 0.7 0.80151913 1.5 
#10: 1.5 -0.11013456 3.0 
#11: 1.5 0.82139242 3.0 
#12: 3.0 -1.24386831 Inf 
4

डमी चर नाम के साथ प्रयोग करें विकल्प है और यह एक नामित सूची फ़ीड:

res <- substitute(dt[binDT,on=.(A>=LB,B<RB)], 
        list(A = as.name(colName), 
         B = as.name(colName))) 

# the values get replaced in the call 
> res 
dt[binDT, on = .(x >= LB, x < RB)] 

eval(res) 

     x   y x.1 
1: -Inf   NA -1.0 
2: -1.0 0.69668714 0.0 
3: -1.0 -0.03824623 0.0 
4: 0.0 0.91269554 0.2 
5: 0.0 0.42322463 0.2 
6: 0.0 -0.22891670 0.2 
7: 0.0 0.61413004 0.2 
8: 0.2   NA 0.7 
9: 0.7 -1.47526635 1.5 
10: 0.7 -1.12899562 1.5 
11: 0.7 1.05462948 1.5 
12: 1.5 -0.04467894 3.0 
13: 3.0   NA Inf 
संबंधित मुद्दे