[英]Subsetting using data.table instead of data.frame
我正在處理一個具有300萬行和10列的數據框,並且正在對其進行一些子設置。 我下面有一些玩具代碼。 當我子集時,它需要很長時間。 如果我使用data.table和data.table上的子集,那會更快嗎? 這是一些玩具代碼:
s<-c(100,100,100,800,800,6662,33565,265653262,266532)
p<-c(5,5,5,10,10,10,8,9,10)
name<-c("bob","bob","bob","ed","ed","ed","joe","frank","ted")
time<- as.POSIXct(as.character(c("2014-10-27 18:11:36 PDT","2014-10-27 18:11:37 PDT","2014-10-27 18:11:38 PDT","2014-10-27 18:11:39 PDT","2014-10-27 18:11:40 PDT","2014-10-27 18:11:41 PDT","2014-10-27 19:11:36 PDT","2014-10-27 20:11:36 PDT","2014-10-27 21:11:36 PDT")))
dat<- data.frame(s,p,name,time)
dat
這是數據幀:
s p name time
1 100 5 bob 2014-10-27 18:11:36
2 100 5 bob 2014-10-27 18:11:37
3 100 5 bob 2014-10-27 18:11:38
4 800 10 ed 2014-10-27 18:11:39
5 800 10 ed 2014-10-27 18:11:40
6 6662 10 ed 2014-10-27 18:11:41
7 33565 8 joe 2014-10-27 19:11:36
8 265653262 9 frank 2014-10-27 20:11:36
9 266532 10 ted 2014-10-27 21:11:36
現在我在數據框上子集:
result <- subset(dat, as.numeric(s) == 100
& p == 5
& name == "bob"
& time >= "2014-10-27 18:11:36 PDT"
& time <= "2014-10-27 18:12:00 PDT"
)
result
s p name time
1 100 5 bob 2014-10-27 18:11:36
2 100 5 bob 2014-10-27 18:11:37
3 100 5 bob 2014-10-27 18:11:38
我如何使用data.table做類似的事情?
謝謝。
好吧,由於使用了“時間”選擇器,因此示例代碼實際上中斷了數據幀-您正在嘗試將POSIXlt日期(在數據幀中)與字符串(在選擇器中)匹配。 我想你要:
result <- subset(dat, as.numeric(s) == 100
& p == 5
& name == "bob"
& time >= as.POSIXlt("2014-10-27 18:11:36 PDT")
& time <= as.POSIXlt("2014-10-27 18:12:00 PDT")
)
result
s p name time
1 100 5 bob 2014-10-27 18:11:36
2 100 5 bob 2014-10-27 18:11:37
3 100 5 bob 2014-10-27 18:11:38
此語法非常適合data.tables:
dat <- as.data.table(dat)
result <- subset(dat,
as.numeric(s) == 100
& p == 5
& name == "bob"
& time >= as.POSIXlt("2014-10-27 18:11:36 PDT")
& time <= as.POSIXlt("2014-10-27 18:12:00 PDT")
)
result
s p name time
1: 100 5 bob 2014-10-27 18:11:36
2: 100 5 bob 2014-10-27 18:11:37
3: 100 5 bob 2014-10-27 18:11:38
如果您想要更多類似於data.table的內容,則可以完全避免“子集”,而直接在data.table上進行操作:
dat <- as.data.table(dat)
result <- dat[as.numeric(s) == 100
& p == 5
& name == "bob"
& time >= as.POSIXlt("2014-10-27 18:11:36 PDT")
& time <= as.POSIXlt("2014-10-27 18:12:00 PDT"),]
result
s p name time
1: 100 5 bob 2014-10-27 18:11:36
2: 100 5 bob 2014-10-27 18:11:37
3: 100 5 bob 2014-10-27 18:11:38
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.