gpt4 book ai didi

R:如何快速对子集的子集进行转换(优化或替代 `ddply` )?

转载 作者:行者123 更新时间:2023-12-04 12:08:14 25 4
gpt4 key购买 nike

我有一个有点大的数据集(784,932 行/项目,27,492 个唯一 ID)。每个项目 在每个 编号 ,如果日期之间的差异小于 60 秒,我正在尝试创建一个等于 1 的虚拟变量。

程式化的数据和代码:

ID <- c(1,1,1,1,1,1,3,3,3,3,3,3)
Item <- c(10,10,10,20,20,20,10,20,10,10,10,20)
Date <- c("19/11/13 18:58:00","19/11/13 18:58:21","19/11/13 20:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 18:58:00","19/11/13 19:58:00")
df <- data.frame(ID, Item, Date)
df <- df[order(ID, Date), ]
df[, "Date"] = lapply(df["Date"],function(x){strptime(x, "%d/%m/%y %H:%M:%S")})

# less than 60 sec difference = 1 (first item set to 999 -> 0)
fnDummy <- function(date) { ifelse(c(999, diff(date))<60, 1, 0) }

library(plyr)
ddply(df, .(ID, Item), transform, Dummy=fnDummy(Date) )

输出:
   ID Item                Date Dummy
1 1 10 2013-11-19 18:58:00 0
2 1 10 2013-11-19 18:58:21 1
3 1 10 2013-11-19 20:58:00 0
4 1 20 2013-11-19 18:58:00 0
5 1 20 2013-11-19 18:58:00 1
6 1 20 2013-11-19 18:58:00 1
7 3 10 2013-11-19 18:58:00 0
8 3 10 2013-11-19 18:58:00 1
9 3 10 2013-11-19 18:58:00 1
10 3 10 2013-11-19 18:58:00 1
11 3 20 2013-11-19 18:58:00 0
12 3 20 2013-11-19 19:58:00 1

从输出中可以看到第一行和第二行有共同的ID和Item,而Date的差值只有21秒,所以dummy为1。第二行和第三行也有共同的ID和Item,但这里的区别在于日期远大于 60 秒,因此 dummy 为 0。

我设法得到了我想要的输出,但操作很慢。对于 1000 行,大约需要 40 秒(请参阅下面的 system.time 结果)。这对应于约。整个数据集需要 180 分钟(我的计算机内存不足并在此之前很久就崩溃了)。
   user  system elapsed 
36.485 3.328 39.800

我怎样才能使这个操作更快?我可以使用 data.table 完成相同的输出吗? ,而且速度更快吗?

最佳答案

您可以使用 data.table正如你所建议的。您必须转换您的 POSIXltPOSIXct尽管:

library(data.table)
df$Date <- as.POSIXct(df$Date)
DT <- as.data.table(df)

DT[, dummy_date := fnDummy(Date), by=c('ID', 'Item')]

然而,放缓的很大一部分可能发生在 ifelse函数,你并不真正需要它,因为你正在创建一个 bool 值:
as.integer(c(FALSE, diff(date) < 60))

关于R:如何快速对子集的子集进行转换(优化或替代 `ddply` )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com