Как сократить время вместо использования l oop в r, поскольку количество строк в 6 цифрах - PullRequest
0 голосов
/ 26 мая 2020
for( i in 1 : nrow(mpa))
{
  if( mpa$dte[i] <= 7 & mpa$dte[i]>=0 ) 
  {mpa$Expiryweeknumber[i]= 1 }   
  if( mpa$dte[i] <= 14 & mpa$dte[i]>=8 )    
  {mpa$Expiryweeknumber[i]= 2 }     
  if( mpa$dte[i] <= 21 & mpa$dte[i]>=15 )    
  {mpa$Expiryweeknumber[i]= 3 }     
  if( mpa$dte[i] <= 28 & mpa$dte[i]>=22 )    
  {mpa$Expiryweeknumber[i]= 4 }     
  if( mpa$dte[i] <= 35 & mpa$dte[i]>=29 )    
  {mpa$Expiryweeknumber[i]= 5 }      
  if( mpa$dte[i] <= 42 & mpa$dte[i]>=36 )    
  {mpa$Expiryweeknumber[i]= 6 }      
  if( mpa$dte[i] <= 48 & mpa$dte[i]>=43 )    
  {mpa$Expiryweeknumber[i]= 7 }       
  if( mpa$dte[i] <= 56 & mpa$dte[i]>=49 )    
  {mpa$Expiryweeknumber[i]= 8 }     
  if( mpa$dte[i] <= 63 & mpa$dte[i]>=50 )    
  {mpa$Expiryweeknumber[i]= 9 }     
  if( mpa$dte[i] <= 70 & mpa$dte[i]>=64 )    
  {mpa$Expiryweeknumber[i]= 10 }      
  if( mpa$dte[i] <= 77 & mpa$dte[i]>=71 )    
  {mpa$Expiryweeknumber[i]= 11 }     
  if( mpa$dte[i] <= 84 & mpa$dte[i]>=78 )    
  {mpa$Expiryweeknumber[i]= 12 }     
  if( mpa$dte[i]>=78 )        
  {mpa$Expiryweeknumber[i]= 13 }     
}

Ответы [ 2 ]

3 голосов
/ 26 мая 2020
mpa$Expiryweeknumber <- ifelse(mpa$dte!=0, ceiling(mpa$dte / 7), 1)
1 голос
/ 26 мая 2020

Вот решение tidyverse, вы не предоставили никаких данных, поэтому я сделал все, чтобы набрать текст. Последняя строка TRUE ~ 999 очень полезна для проверки работоспособности.

library(dplyr)


dte <- sample(0:100, size = 1000, replace = TRUE)
mpa <- data.frame(dte)

mpa %>% mutate(
  Expiryweeknumber = case_when(
    dte >= 0 & dte <= 7 ~ 1,
    dte >= 8 & dte <= 14 ~ 2,
    dte >= 15 & dte <= 21 ~ 3,
    #### you can add the rest
    TRUE ~ 999
  )
) %>% 
  head(15)
#>    dte Expiryweeknumber
#> 1   92              999
#> 2  100              999
#> 3   60              999
#> 4   46              999
#> 5   57              999
#> 6   85              999
#> 7   21                3
#> 8   48              999
#> 9   51              999
#> 10   5                1
#> 11  21                3
#> 12  24              999
#> 13  34              999
#> 14  89              999
#> 15  92              999
...