首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速/替换数百万数据的循环:判断多个日期范围

加速/替换数百万数据的循环:判断多个日期范围
EN

Stack Overflow用户
提问于 2019-09-20 12:23:44
回答 1查看 28关注 0票数 1

晚上好,伙计们,我有六百万的数据,他们有四种类型。

代码语言:javascript
复制
z=structure(list(date = structure(c(11866, 16190, 14729, 11718), class = "Date"), 
           beg1 = structure(c(12264, 12264, 13970, 12264), class = "Date"), 
           end1 = structure(c(17621, 14760, 14760, 13298), class = "Date"), 
           ID1 = c(1003587, 1000396, 1010743, 1002113), beg2 = structure(c(NA, 
                                                                           14790, 14790, 13299), class = "Date"), end2 = structure(c(NA, 
                                                                                                                                     17621, 15217, 13969), class = "Date"), ID2 = c(NA, 1024488, 
                                                                                                                                                                                    1027877, 1002824), beg3 = structure(c(NA, NA, 15218, 13970
                                                                                                                                                                                    ), class = "Date"), end3 = structure(c(NA, NA, 17621, 14760
                                                                                                                                                                                    ), class = "Date"), ID3 = c(NA, NA, 1031361, 1002113), beg4 = structure(c(NA, 
                                                                                                                                                                                                                                                              NA, NA, 14790), class = "Date"), end4 = structure(c(NA, NA, 
                                                                                                                                                                                                                                                                                                                  NA, 17621), class = "Date"), ID4 = c(NA, NA, NA, 1021290), 
           realID = c(NA, NA, NA, NA)), row.names = c(267365L, 193587L, 
                                                      5294385L, 2039421L), class = "data.frame")

我试着根据他们的日期来判断和分配一个合适的ID (使用循环)。

代码语言:javascript
复制
for(i in 1:nrow(z)){tryCatch({print(i)
if(between(z$date[i],z$beg1[i],z$end1[i])==T){z$realID[i]=z$ID1[i]}
if(between(z$date[i],z$beg2[i],z$end2[i])==T){z$realID[i]=z$ID2[i]}
if(between(z$date[i],z$beg3[i],z$end3[i])==T){z$realID[i]=z$ID3[i]}
if(between(z$date[i],z$beg4[i],z$end4[i])==T){z$realID[i]=z$ID4[i]}},error=function(e){})}          

密码有效。但是,现在的问题是我有太多的数据,循环效率很低,可能要花将近一天的时间循环。

有人知道如何改进或替换代码吗?非常感谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-20 12:58:14

由于R是一种矢量化语言,为了加快这段代码的速度,最好是对整个向量进行操作,而不是循环遍历每个元素。

简单的解决方案是使用一系列ifelse语句。

代码语言:javascript
复制
z$realID <- ifelse(!is.na(z$beg1) & z$date> z$beg1 & z$date< z$end1, z$ID1, z$realID)
z$realID <- ifelse(!is.na(z$beg2) & z$date> z$beg2 & z$date< z$end2, z$ID2, z$realID)
z$realID <- ifelse(!is.na(z$beg3) & z$date> z$beg3 & z$date< z$end3, z$ID3, z$realID)
z$realID <- ifelse(!is.na(z$beg4) & z$date> z$beg4 & z$date< z$end4, z$ID4, z$realID)

if语句计算为TRUE时,realID将更新(如果不是),它将保留其先前的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58028339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档