我有一个这样的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中实现这一目标?