使用data.table代替data.frame进行子集设置

使用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

我正在处理一个有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
现在,我在数据帧上创建一个子集:

  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