我在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
答案 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")
})