- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
...如果可能的话
我的任务是找到用户参与游戏的最长连续天数。
我没有编写 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)))
}
最佳答案
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/
嗨,我是第一次玩 Pig,我很好奇如何处理将一个字段拆分成多个其他字段。 我有一个包,A,如下图: grunt> Dump A; (text, text, Mon Mar 07 12:00:00 CD
如何添加架构中未定义的固定字段(例如日期或月份)?我运行了以下 pig 脚本以将固定日期添加到我的结果表中,并收到以下错误消息:Invalid field projection。方案中不存在投影字段
我是一名优秀的程序员,十分优秀!