R 改进这个循环的想法可能吗?

R 改进这个循环的想法可能吗?,r,loops,R,Loops,我一直在阅读如何改进R中的代码,看看这里的一些答案,还阅读了一些R地狱文档。现在我遇到了这个问题,我创建的循环似乎要花很长时间(15个小时,而且还在计算) k代码有点难读,但我想这就是你想要做的: library(data.table) ## generate a data table dt <- setDT(df[,c("Duration","StartStation.Id","EndStation.Id")]) ## calculate the duration dt[, Durati

我一直在阅读如何改进R中的代码,看看这里的一些答案,还阅读了一些R地狱文档。现在我遇到了这个问题,我创建的循环似乎要花很长时间(15个小时,而且还在计算)


k代码有点难读,但我想这就是你想要做的:

library(data.table)
## generate a data table
dt <- setDT(df[,c("Duration","StartStation.Id","EndStation.Id")])
## calculate the duration
dt[, Duration := Duration / median(Duration), by = .(StartStation.Id, EndStation.Id)]
## replace the result with NA when the vector length == 1
dt[, N := .N, by = .(StartStation.Id, EndStation.Id)][
    N == 1, Duration := NA
    ][, N := NULL]
库(data.table)
##生成数据表

dt如果我正确理解您的函数,您希望将两个站点之间的持续时间除以它的中间持续时间,并且如果设置为
NA

这是一个基本解决方案(有点笨重,我还没喝完第一杯咖啡):

##一些示例数据

欢迎来到StackOverflow!请仔细阅读并制作您的示例。您的循环运行750x750次,但您使用的是向量运算而不是标量运算。谢谢emiliman5。是的,这就是我想做的。我将尝试这个实现。我必须回顾一下分组函数。这看起来很简单,我肯定会更深入地研究data.table。谢谢你的回答。唯一的小区别是,当向量长度为1或更小时,我想用NA替换,但这是为了避免计算中的错误,并且能够在以后轻松地删除它们。因此,理想情况下,我会编辑第二部分,以摆脱这些
library(data.table)
## generate a data table
dt <- setDT(df[,c("Duration","StartStation.Id","EndStation.Id")])
## calculate the duration
dt[, Duration := Duration / median(Duration), by = .(StartStation.Id, EndStation.Id)]
## replace the result with NA when the vector length == 1
dt[, N := .N, by = .(StartStation.Id, EndStation.Id)][
    N == 1, Duration := NA
    ][, N := NULL]
##Some sample data
df <- data.frame(StartStation.Id=sample(LETTERS[1:10], 100, replace =T),
                 EndStation.Id=sample(LETTERS[11:20], 100, replace =T),
                 Duration=runif(100, 0.1,100))
    res <- tapply(df$Duration, paste0(df$StartStation.Id, df$EndStation.Id), function(x) x/median(x))
    res <- data.frame(StartStation.Id=sapply(strsplit(rep(names(res), sapply(res, length)), ""), "[", 1),
                      EndStation.Id=sapply(strsplit(rep(names(res), sapply(res, length)), ""), "[", 2),
                      durn=unlist(res))
res[res$durn==1,] <- NA