Using := in data.table with paste()

后端 未结 2 1650
轻奢々
轻奢々 2020-12-19 02:05

I have started using data.table for a large population model. So far, I have been impressed because using the data.table structure decreases my simulation run t

2条回答
  •  忘掉有多难
    2020-12-19 02:45

    ## Start with 1st three columns of example data
    dt <- exampleTable[,1:3]
    
    ## Run for 1st five years
    nYears <- 5
    for(ii in seq_len(nYears)-1) {
        y0 <- as.symbol(paste0("popYears", ii))
        y1 <- paste0("popYears", ii+1)
        dt[, (y1) := eval(y0)*growthRate]
    }
    
    ## Check that it worked
    dt
    #     Site growthRate popYears0 popYears1 popYears2 popYears3 popYears4 popYears5
    #1: Site 1        1.1        10      11.0     12.10    13.310   14.6410  16.10510
    #2: Site 2        1.2        12      14.4     17.28    20.736   24.8832  29.85984
    #3: Site 3        1.3        13      16.9     21.97    28.561   37.1293  48.26809
    

    Edit:

    Because the possibility of speeding this up using set() keeps coming up in the comments, I'll throw this additional option out there.

    nYears <- 5
    
    ## Things that only need to be calculated once can be taken out of the loop
    r <- dt[["growthRate"]]
    yy <- paste0("popYears", seq_len(nYears+1)-1)
    
    ## A loop using set() and data.table's nice compact syntax
    for(ii in seq_len(nYears)) {
        set(dt, , yy[ii+1], r*dt[[yy[ii]]])
    }
    
    ## Check results
    dt
    #     Site growthRate popYears0 popYears1 popYears2 popYears3 popYears4 popYears5
    #1: Site 1        1.1        10      11.0     12.10    13.310   14.6410  16.10510
    #2: Site 2        1.2        12      14.4     17.28    20.736   24.8832  29.85984
    #3: Site 3        1.3        13      16.9     21.97    28.561   37.1293  48.26809
    

提交回复
热议问题