使用data.table代替data.frame进行子集设置
我正在处理一个有300万行和10列的数据帧,我正在对它进行子集设置。下面我有一些玩具代码。当我离开时,这需要很长时间。如果我使用data.table和data.table上的子集,会更快吗?以下是一些玩具代码:使用data.table代替data.frame进行子集设置,r,data.table,R,Data.table,我正在处理一个有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
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
现在,我在数据帧上创建一个子集:
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
result=“2014-10-27 18:11:36 PDT”
&时间由于“时间”选择器的作用,您的示例代码实际上在数据帧中中断-您正在尝试将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
result=as.POSIXlt(“2014-10-27 18:11:36 PDT”)
&时间没有破坏我的密码。如果我使用data.table,它会比使用data.frame快吗?那么我不确定您必须使用什么环境才能检查POSIX时间戳是否小于或大于strings;)。对于子集操作?对其进行基准测试和测试。在需要对数据执行子集操作以提取或合成值的情况下,我倾向于使用data.table—在这种情况下,它们的速度要快得多。
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
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
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