改进R

时间:2016-10-25 14:57:34

标签: r loops if-statement

我在R中编写了一个非常简单的代码,但在将数据用于数据时需要将近2个小时> 2.000.000行。

有没有机会改进代码?我希望解决方案尽可能简单。

我的R技能还可以(经验<1年),但在这种情况下我达到了极限。另外我读了一些关于加速if else循环的一些知识,但我不确定哪种策略最适合我的代码(例如Vectorise,ifelse,Parallelism等)。

感谢您的帮助。

    system.time(
      for (i in 1:(length(mydata$session_id)-1)){
        if (mydata$session_id[i] != mydata$session_id[i+1]){
          mydata$Einstiegskanal[i]="1"
        } else {
          mydata$Einstiegskanal[i]="0"
        }
      }
    )

    # 6877,1 Seconds = 1,91 h

3 个答案:

答案 0 :(得分:3)

看起来你正在做的只是从一行到下一行的ID之间的差异。 [NSTimer scheduledTimerWithTimeInterval:gameInterval repeats:NO block:^(NSTimer *timer) { NSLog(@"herp derp"); }]; 是为此而做的。

diff

如果您真的想加快速度,可以尝试避免使用session_id <- sample(1:10, size = 2000000, replace = TRUE) system.time({ ifelse(c(diff(session_id) == 0, NA), "1", "0") }) user system elapsed 0.64 0.05 0.69

您的代码将是

ifelse

比较两种方法之间的速度:

lgl <- c(diff(x) == 0, NA)

mydata$Einstiegskanal[!lgl] <- "1"
mydata$Einstiegskanal[lgl] <- "0"

答案 1 :(得分:0)

你可以尝试这样的事情:

mydata <- data.frame(session_id = round(runif(2e6, 0, 10), 0))
mydata2 <- data.frame(session_id = mydata[-1,])
mydata$Einstiegskanal <- c(ifelse(mydata$session_id[1:(nrow(mydata)-1)]==mydata2,1,0), NA)

我将df$Equal的最后一个值设置为NA,因为此向量的元素少于df

答案 2 :(得分:0)

非常感谢您的回答!

Benjamin的以下改编代码对我来说非常适合:)与diff结合使用的diff函数非常聪明,它适用于我的许多if else循环。

system.time({
  mydata$Einstiegskanal<-ifelse(c(diff(mydata$session_id) == 0, NA), "0", "1")
})