สองวิธีในการเลือกตัวแปรโดยทางโปรแกรม:
with = FALSE
:
DT = data.table(col1 = 1:3)
colname = "col1"
DT[, colname, with = FALSE]
'dot dot' ( ..
) คำนำหน้า:
DT[, ..colname]
สำหรับคำอธิบายเพิ่มเติมของ..
สัญกรณ์'dot dot' ( ) โปรดดูคุณลักษณะใหม่ใน 1.10.2 (ขณะนี้ยังไม่ได้อธิบายไว้ในข้อความช่วยเหลือ)
ในการกำหนดให้กับตัวแปรให้ห่อ LHS ของ:=
ในวงเล็บ:
DT[, (colname) := 4:6]
ส่วนหลังนี้เรียกว่าคอลัมน์plonkเนื่องจากคุณแทนที่เวกเตอร์คอลัมน์ทั้งหมดโดยการอ้างอิง หากมีชุดย่อยi
อยู่ชุดย่อยจะถูกกำหนดย่อยโดยการอ้างอิง parens รอบ(colname)
เป็นชวเลขที่เปิดตัวในเวอร์ชัน v1.9.4 เมื่อ CRAN ต.ค. 2014 นี่คือรายการข่าว :
การใช้with = FALSE
กับ:=
ถูกเลิกใช้แล้วในทุกกรณีเนื่องจากว่าการตัด LHS :=
ด้วยวงเล็บเป็นที่ต้องการในบางครั้ง
colVar = "col1"
DT[, (colVar) := 1]
DT[, c("col1", "col2") := 1]
DT[, 2:4 := 1]
DT[, c("col1","col2") := list(sum(a), mean(b))]
DT[, `:=`(...), by = ...]
ดูส่วนรายละเอียดเพิ่มเติมใน?`:=`
:
DT[i, (colnamevector) := value]
และเพื่อตอบคำถามเพิ่มเติมในความคิดเห็นนี่เป็นวิธีเดียว (ตามปกติมีหลายวิธี):
DT[, colname := cumsum(get(colname)), with = FALSE]
หรือคุณอาจพบว่าง่ายกว่าในการอ่านเขียนและดีบักเฉพาะกับeval
a paste
คล้ายกับการสร้างคำสั่ง SQL แบบไดนามิกเพื่อส่งไปยังเซิร์ฟเวอร์:
expr = paste0("DT[,",colname,":=cumsum(",colname,")]")
expr
eval(parse(text=expr))
หากคุณทำมากคุณสามารถกำหนดฟังก์ชันตัวช่วยEVAL
:
EVAL = function(...)eval(parse(text=paste0(...)),envir=parent.frame(2))
EVAL("DT[,",colname,":=cumsum(",colname,")]")
ตอนนี้data.table
1.8.2 ปรับประสิทธิภาพให้เหมาะสมโดยอัตโนมัติj
แล้วจึงควรใช้eval
วิธีนี้ get()
ในj
ป้องกันไม่ให้การเพิ่มประสิทธิภาพบางอย่างเช่น
set()
หรือมี ค่าใช้จ่ายต่ำรูปแบบการทำงาน:=
ซึ่งจะดีที่นี่ ดู?set
.
set(DT, j = colname, value = cumsum(DT[[colname]]))
DT