识别和内插值

时间:2018-11-14 09:01:33

标签: r data.table

我有一个这样的data.table,只是具有更多的变量和更多的观察结果:

    name       date salary
 1: Luke 2000-01-01    100
 2: Luke 2000-02-01    120
 3: Luke 2000-03-01    150
 4: Luke 2000-04-01    200
 5: Luke 2000-05-01    800
 6: Luke 2000-06-01   1000
 7: Luke 2000-07-01    900
 8: Luke 2000-08-01    250
 9: Luke 2000-09-01    280
10: Luke 2000-10-01      2
11: Luke 2000-11-01      3
12: Luke 2000-12-01    270
13: Luke 2001-01-01    280
14: John 2008-01-01    500
15: John 2008-02-01    600
16: John 2008-03-01     50
17: John 2008-04-01     40
18: John 2008-05-01     45

对于name的每个值,我想查找与前一个值相比减少或增加50%以上的工资的第一个值,保存该前一个值(在减少或增加之前的值),并将其用作基准以找到另一个工资值,该工资值在该基准值附近+/- 50%之间,然后在这些值之间进行内插。我创建了一个可以确定基准值的百分比变化变量:

    name       date salary lag_salary percent_change interpolate_values
 1: Luke 2000-01-01    100         NA             NA                100
 2: Luke 2000-02-01    120        100      20.000000                120
 3: Luke 2000-03-01    150        120      25.000000                150
 4: Luke 2000-04-01    200        150      33.333333                200
 5: Luke 2000-05-01    800        200     300.000000                 NA
 6: Luke 2000-06-01   1000        800      25.000000                 NA
 7: Luke 2000-07-01    900       1000     -10.000000                 NA
 8: Luke 2000-08-01    250        900     -72.222222                250
 9: Luke 2000-09-01    280        250      12.000000                280
10: Luke 2000-10-01      2        280     -99.285714                 NA
11: Luke 2000-11-01      3          2      50.000000                 NA
12: Luke 2000-12-01    270          3    8900.000000                270
13: Luke 2001-01-01    280        270       3.703704                280
14: John 2008-01-01    500         NA             NA                500
15: John 2008-02-01    600        500      20.000000                600
16: John 2008-03-01     50        600     -91.666667                 50
17: John 2008-04-01     40         50     -20.000000                 40
18: John 2008-05-01     45         40      12.500000                 45

对于卢克来说,第一个基准值是200,因为在此值之后,薪水增加了300%(超过50%),然后我想找到第二个值,该值在该基准值的50%以内=在(100,300)范围内,然后在这些值之间进行插值。因此,在这种情况下,值为250,并且插值将在200和250之间,以替换值800,1000和900。然后,对于Luke,值为280,之后salary减小了50以上%。同样,我想将此280作为基准值,并找到另一个距离该基准50%以内的值-范围(140,420)-并在280和该其他值之间进行插值。该其他值将为270。我想根据此方法用线性插值替换的值在最后一栏中标记为NA。对于John来说,没有插值法,因为从600到50仅有一个变化,而在600以后的50%之内没有值。 这是创建此data.table的代码:

name <- c(rep("Luke",13), rep("John",5))
date <- c(seq(as.Date("2000/1/1"), by = "month", length.out = 13), seq(as.Date("2008/1/1"), by = "month", length.out = 5))
salary <- c(100,120,150,200,800,1000,900,250,280,2,3,270,280,500,600,50,40,45)
my_data <- data.table(name,date,salary)

my_data[,lag_salary := lag(salary,1), by = "name"]
my_data[,percent_change := ((salary - lag_salary)/lag_salary)*100]
my_data[,interpolate_values := c(100,120,150,200,NA,NA,NA,250,280,NA,NA,270,280,500,600,50,40,45)]

是否有可能在data.table中实现这一目标?

0 个答案:

没有答案