เลือกหลายคอลัมน์ใน data.table ตามดัชนีตัวเลข


143

เราจะเลือกหลายคอลัมน์โดยใช้เวกเตอร์ของดัชนีตัวเลขของพวกเขา (ตำแหน่ง) ในได้data.tableอย่างไร?

นี่คือวิธีที่เราจะทำกับdata.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

คำตอบ:


185

สำหรับ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


1
ไม่มีปัญหา. เปรียบเทียบdt[,"a"]และdt[,"a", with=FALSE]เพื่อดูว่าเป็นตัวเลือกที่มีประโยชน์จริงๆ
Josh O'Brien

3
มีวิธีใดที่จะทำสิ่งนี้โดยไม่ใช้? ตัวอย่างเช่นDT[,list(b:c)ฉันพบว่ามันสะดวกในการแปลงคอลัมน์โดยตรงในตารางข้อมูลเช่นฉันสามารถทำได้DT[,list(1/b,2*c)]แต่สิ่งนี้ไม่ได้ทำงานด้วย
jamborta

2
การเปลี่ยนแปลงแพ็คเกจจะทำให้with=FALSEไม่จำเป็นในกรณีนี้: github.com/Rdatatable/data.table/issues/ ......
Frank

1
@ Frank - นั่นเป็นข่าวดี! ขอขอบคุณที่แจ้งให้ฉันทราบ เมื่อการเปลี่ยนแปลงนั้นมาถึงรุ่นของdata.tableกระจายบน CRAN ฉันจะแก้ไขคำตอบนี้เพื่อประกาศการเปลี่ยนแปลงขึ้นไปข้างบน (และได้โปรด - คุณหรือคนอื่น ๆ ที่อ่านข้อความนี้ - รู้สึกอิสระที่จะส่งคำเตือนให้ฉันทันทีที่เกิดขึ้น)
Josh O'Brien

2
@Valentas ตลกที่คุณควรถาม ไม่มีทางเข้ากันได้กับการใช้งานdata.frame with=FALSEแต่เป็นประมาณ 3 สัปดาห์ที่ผ่านมารุ่นพัฒนาของdata.tableได้รับการแก้ไขเพื่อโทรชอบdt[, 2], dt[, 2:3], dt[, "b"]และdt[, c("b", "c")]ประพฤติตัวเช่นเดียวกับที่พวกเขาทำในที่มีdata.frames โดยไม่ต้องwith=FALSEมีการกำหนดอย่างชัดเจน มันยอดเยี่ยมมาก! ดูที่นี่สำหรับการกระทำที่เฉพาะเจาะจงรวมถึงรายการข่าวที่อธิบายการเปลี่ยนแปลง
Josh O'Brien

43

มันค่อนข้างละเอียด แต่ฉันเคยชินกับการใช้.SDตัวแปรที่ซ่อนอยู่

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

มันค่อนข้างยุ่งยาก แต่คุณไม่ต้องสูญเสียคุณสมบัติ data.table อื่น ๆ (ฉันไม่คิดว่า) ดังนั้นคุณควรใช้ฟังก์ชั่นสำคัญอื่น ๆ เช่นเข้าร่วมตารางเป็นต้น


6
ไม่ยุ่งยากและมีประโยชน์มากเมื่อสร้างรายการคอลัมน์โดยทางโปรแกรม
Chris

39

หากคุณต้องการใช้ชื่อคอลัมน์เพื่อเลือกคอลัมน์เพียงใช้.()ซึ่งเป็นชื่อแทนสำหรับ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

19

ตั้งแต่ v1.10.2 เป็นต้นไปคุณสามารถใช้ ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
ขอบคุณสำหรับคำตอบนี้ ฉันก็พบว่าdt[, !..keep_cols]และ dt[, -..keep_cols] ทำงานตามที่คาดไว้!
IceCreamToucan

3

@ 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)]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.