เราจะเลือกหลายคอลัมน์โดยใช้เวกเตอร์ของดัชนีตัวเลขของพวกเขา (ตำแหน่ง) ในได้data.table
อย่างไร?
นี่คือวิธีที่เราจะทำกับdata.frame
:
df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
# b c
# 1 2 3
เราจะเลือกหลายคอลัมน์โดยใช้เวกเตอร์ของดัชนีตัวเลขของพวกเขา (ตำแหน่ง) ในได้data.table
อย่างไร?
นี่คือวิธีที่เราจะทำกับdata.frame
:
df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
# b c
# 1 2 3
คำตอบ:
สำหรับdata.table เวอร์ชัน>= 1.9.8
ต่อไปนี้ใช้งานได้ทั้งหมด:
library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)
# select single column by index
dt[, 2]
# b
# 1: 2
# select multiple columns by index
dt[, 2:3]
# b c
# 1: 2 3
# select single column by name
dt[, "a"]
# a
# 1: 1
# select multiple columns by name
dt[, c("a", "b")]
# a b
# 1: 1 2
สำหรับรุ่นdata.table < 1.9.8
(สำหรับการเลือกคอลัมน์ตัวเลขจำเป็นต้องใช้with = FALSE
) ให้ดูคำตอบรุ่นก่อนหน้านี้ ดูข่าวจาก v1.9.8, การเปลี่ยนแปลงที่อาจเกิดขึ้นได้ในจุดที่ 3
DT[,list(b:c)
ฉันพบว่ามันสะดวกในการแปลงคอลัมน์โดยตรงในตารางข้อมูลเช่นฉันสามารถทำได้DT[,list(1/b,2*c)]
แต่สิ่งนี้ไม่ได้ทำงานด้วย
with=FALSE
ไม่จำเป็นในกรณีนี้: github.com/Rdatatable/data.table/issues/ ......
data.frame
with=FALSE
แต่เป็นประมาณ 3 สัปดาห์ที่ผ่านมารุ่นพัฒนาของdata.tableได้รับการแก้ไขเพื่อโทรชอบdt[, 2]
, dt[, 2:3]
, dt[, "b"]
และdt[, c("b", "c")]
ประพฤติตัวเช่นเดียวกับที่พวกเขาทำในที่มีdata.frame
s โดยไม่ต้องwith=FALSE
มีการกำหนดอย่างชัดเจน มันยอดเยี่ยมมาก! ดูที่นี่สำหรับการกระทำที่เฉพาะเจาะจงรวมถึงรายการข่าวที่อธิบายการเปลี่ยนแปลง
มันค่อนข้างละเอียด แต่ฉันเคยชินกับการใช้.SD
ตัวแปรที่ซ่อนอยู่
b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]
มันค่อนข้างยุ่งยาก แต่คุณไม่ต้องสูญเสียคุณสมบัติ data.table อื่น ๆ (ฉันไม่คิดว่า) ดังนั้นคุณควรใช้ฟังก์ชั่นสำคัญอื่น ๆ เช่นเข้าร่วมตารางเป็นต้น
หากคุณต้องการใช้ชื่อคอลัมน์เพื่อเลือกคอลัมน์เพียงใช้.()
ซึ่งเป็นชื่อแทนสำหรับlist()
:
library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
# b c
# 1: 2 3
# 2: 3 4
ตั้งแต่ v1.10.2 เป็นต้นไปคุณสามารถใช้ ..
dt <- data.table(a=1:2, b=2:3, c=3:4)
keep_cols = c("a", "c")
dt[, ..keep_cols]
dt[, !..keep_cols]
และ dt[, -..keep_cols]
ทำงานตามที่คาดไว้!
@ Tom ขอบคุณมากสำหรับการชี้ให้เห็นทางออกนี้ มันใช้งานได้ดีสำหรับฉัน
ฉันกำลังมองหาวิธีที่จะแยกคอลัมน์หนึ่งจากการพิมพ์และจากตัวอย่างข้างต้น หากต้องการยกเว้นคอลัมน์ที่สองคุณสามารถทำสิ่งนี้ได้
library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
dt[,"a"]
และdt[,"a", with=FALSE]
เพื่อดูว่าเป็นตัวเลือกที่มีประโยชน์จริงๆ