Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Basic use of approx() for lookup table with linear interpolation

I have a vector, my_points and a dataframe that describes the almost linear relationship between points and values.

How do I obtain the vector, my_values, from the relationship described in the dataframe and my_points using linear interpolation?

Assume the relationship beyond the last point in the data frame remains linear.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

my_points <- c(4400, 8800, 13200, 37600, 42000, 46400, 50800, 55200, 59600, 
       64000, 68400, 72800, 77200, 81600, 86000, 90400, 94800, 99200, 
       103600, 108000, 112400, 116800, 121200, 125600)


df <- structure(list(points = c(3000, 4500, 7500, 11000, 14500, 21500, 
                                43000, 71500), values = c(20, 30, 50, 75, 100, 150, 300, 500), 
                     points_per_value = c(150, 150, 150, 146.666666666667, 145, 
                                          143.333333333333, 143.333333333333, 143)), row.names = c(NA, 
                                                                                                   -8L), class = c("tbl_df", "tbl", "data.frame"))

>Solution :

You said "interpolation", in which case you can get:

cbind(
  data.frame(my_points),
  lapply(df[-1], function(z) approx(df$points, z, xout = my_points)$y)
)
#    my_points    values points_per_value
# 1       4400  29.33333         150.0000
# 2       8800  59.28571         148.7619
# 3      13200  90.71429         145.6190
# 4      37600 262.32558         143.3333
# 5      42000 293.02326         143.3333
# 6      46400 323.85965         143.2936
# 7      50800 354.73684         143.2421
# 8      55200 385.61404         143.1906
# 9      59600 416.49123         143.1392
# 10     64000 447.36842         143.0877
# 11     68400 478.24561         143.0363
# 12     72800        NA               NA
# 13     77200        NA               NA
# 14     81600        NA               NA
# 15     86000        NA               NA
# 16     90400        NA               NA
# 17     94800        NA               NA
# 18     99200        NA               NA
# 19    103600        NA               NA
# 20    108000        NA               NA
# 21    112400        NA               NA
# 22    116800        NA               NA
# 23    121200        NA               NA
# 24    125600        NA               NA

But you also said "beyond the last point", suggesting you want "extrapolation":

cbind(
  data.frame(my_points), lapply(df[-1], function(z) 
  Hmisc::approxExtrap(df$points, z, xout = my_points)$y)
)
#    my_points    values points_per_value
# 1       4400  29.33333         150.0000
# 2       8800  59.28571         148.7619
# 3      13200  90.71429         145.6190
# 4      37600 262.32558         143.3333
# 5      42000 293.02326         143.3333
# 6      46400 323.85965         143.2936
# 7      50800 354.73684         143.2421
# 8      55200 385.61404         143.1906
# 9      59600 416.49123         143.1392
# 10     64000 447.36842         143.0877
# 11     68400 478.24561         143.0363
# 12     72800 509.12281         142.9848
# 13     77200 540.00000         142.9333
# 14     81600 570.87719         142.8819
# 15     86000 601.75439         142.8304
# 16     90400 632.63158         142.7789
# 17     94800 663.50877         142.7275
# 18     99200 694.38596         142.6760
# 19    103600 725.26316         142.6246
# 20    108000 756.14035         142.5731
# 21    112400 787.01754         142.5216
# 22    116800 817.89474         142.4702
# 23    121200 848.77193         142.4187
# 24    125600 879.64912         142.3673

If all you need is the vector of one of these columns, then

Hmisc::approxExtrap(df$points, df$my_values, xout = my_points)$y
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading