gpt4 book ai didi

r - 帮我用 "apply"函数替换 for 循环

转载 作者:行者123 更新时间:2023-12-04 10:57:47 24 4
gpt4 key购买 nike

...如果可能的话

我的任务是找到用户参与游戏的最长连续天数。

我没有编写 sql 函数,而是选择使用 R 的 rle 函数,以获得最长的条纹,然后用结果更新我的 db 表。

(附加的)数据框是这样的:

    day      user_id
2008/11/01 2001
2008/11/01 2002
2008/11/01 2003
2008/11/01 2004
2008/11/01 2005
2008/11/02 2001
2008/11/02 2005
2008/11/03 2001
2008/11/03 2003
2008/11/03 2004
2008/11/03 2005
2008/11/04 2001
2008/11/04 2003
2008/11/04 2004
2008/11/04 2005

我尝试了以下方法来获得每个用户最长的连续记录
# turn it to a contingency table
my_table <- table(user_id, day)

# get the streaks
rle_table <- apply(my_table,1,rle)

# verify the longest streak of "1"s for user 2001
# as.vector(tapply(rle_table$'2001'$lengths, rle_table$'2001'$values, max)["1"])

# loop to get the results
# initiate results matrix
res<-matrix(nrow=dim(my_table)[1], ncol=2)

for (i in 1:dim(my_table)[1]) {
string <- paste("as.vector(tapply(rle_table$'", rownames(my_table)[i], "'$lengths, rle_table$'", rownames(my_table)[i], "'$values, max)['1'])", sep="")
res[i,]<-c(as.integer(rownames(my_table)[i]) , eval(parse(text=string)))
}

不幸的是,这个 for 循环花费的时间太长,我想知道是否有办法使用“apply”系列中的函数生成 res 矩阵。

先感谢您

最佳答案

apply 函数并不总是(甚至通常)比 for 循环快。这是 R 与 S-Plus 关联的残余(在后者中,apply 比 for 快)。一个异常(exception)是 lapply ,它通常比 for 快(因为它使用 C 代码)。 See this related question

所以你应该使用 apply 主要是为了提高代码的清晰度,而不是为了提高性能。

你可能 find Dirk's presentation on high-performance computing useful 。另一种蛮力方法是 "just-in-time compilation" with Ra instead of the normal R version ,它经过优化以处理 for 循环。

[编辑:] 显然有很多方法可以实现这一点,即使它更紧凑,这也绝不是更好。只需使用您的代码,这是另一种方法:

dt <- data.frame(table(dat))[,2:3]
dt.b <- by(dt[,2], dt[,1], rle)
t(data.frame(lapply(dt.b, function(x) max(x$length))))

您可能需要进一步操作输出。

关于r - 帮我用 "apply"函数替换 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504832/

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