r - 用时间序列或同一列中的相邻值替换NA值-data.table方法

标签 r data.table interpolation na missing-data

样本数据

df <- data.frame(id=c("A","A","A","A","B","B","B","B"),year=c(2014,2014,2015,2015),month=c(1,2),marketcap=c(4,6,2,6,23,2,5,34),return=c(NA,0.23,0.2,0.1,0.4,0.9,NA,0.6))

df1
   id year month marketcap return
1:  A 2014     1         4     NA
2:  A 2014     2         6   0.23
3:  A 2015     1         2   0.20
4:  A 2015     2         6   0.10
5:  B 2014     1        23   0.40
6:  B 2014     2         2   0.90
7:  B 2015     1         5     NA
8:  B 2015     2        34   0.60

所需数据
desired_df <- data.frame(id=c("A","A","A","A","B","B","B","B"),year=c(2014,2014,2015,2015),month=c(1,2),marketcap=c(4,6,2,6,23,2,5,34),return=c(0.23,0.23,0.2,0.1,0.4,0.9,0.75,0.6))

desired_df
  id year month marketcap return
1  A 2014     1         4   0.23
2  A 2014     2         6   0.23
3  A 2015     1         2   0.20
4  A 2015     2         6   0.10
5  B 2014     1        23   0.40
6  B 2014     2         2   0.90
7  B 2015     1         5   0.75
8  B 2015     2        34   0.60

我想通过用id将时间序列中的相邻值替换NA值来插值return。假设只有两个月:一年中的1,2。
(B,2015,1)的第二个NA替换为0.75 =(0.9 + 0.6)/ 2
由于没有先前的数据,(A,2014,1)的第一个NA被替换为0.23。

如果可能,首选data.table解决方案

更新:
使用以下代码结构时(适用于示例)
df[,returnInterpolate:=na.approx(return,rule=2), by=id]

我遇到了错误:
大约(x [!na],y [!na],xout,...)中的错误:
需要至少两个非NA值进行插值

我想可能是有些id没有非NA值要插值。 。有什么建议么?

最佳答案

library(data.table)
df <- data.frame(id=c("A","A","A","A","B","B","B","B"),
                 year=c(2014,2014,2015,2015),
                 month=c(1,2),
                 marketcap=c(4,6,2,6,23,2,5,34),
                 return=c(NA,0.23,0.2,0.1,0.4,0.9,NA,0.6))
setDT(df)
library(zoo)
df[, returnInterpol := na.approx(return, rule = 2), by = id]
#   id year month marketcap return returnInterpol
#1:  A 2014     1         4     NA           0.23
#2:  A 2014     2         6   0.23           0.23
#3:  A 2015     1         2   0.20           0.20
#4:  A 2015     2         6   0.10           0.10
#5:  B 2014     1        23   0.40           0.40
#6:  B 2014     2         2   0.90           0.90
#7:  B 2015     1         5     NA           0.75
#8:  B 2015     2        34   0.60           0.60

编辑:

如果您的组中只有NA值或只有一个non-NA,则可以执行以下操作:
df <- data.frame(id=c("A","A","A","A","B","B","B","B","C","C","C","C"),
                 year=c(2014,2014,2015,2015),
                 month=c(1,2),
                 marketcap=c(4,6,2,6,23,2,5,34, 1:4),
                 return=c(NA,0.23,0.2,0.1,0.4,0.9,NA,0.6,NA,NA,0.3,NA))
setDT(df)
df[, returnInterpol := switch(as.character(sum(!is.na(return))),
                              "0" = return,
                              "1" = {na.omit(return)},  
                              na.approx(return, rule = 2)), by = id]

#     id year month marketcap return returnInterpol
#  1:  A 2014     1         4     NA           0.23
#  2:  A 2014     2         6   0.23           0.23
#  3:  A 2015     1         2   0.20           0.20
#  4:  A 2015     2         6   0.10           0.10
#  5:  B 2014     1        23   0.40           0.40
#  6:  B 2014     2         2   0.90           0.90
#  7:  B 2015     1         5     NA           0.75
#  8:  B 2015     2        34   0.60           0.60
#  9:  C 2014     1         1     NA           0.30
# 10:  C 2014     2         2     NA           0.30
# 11:  C 2015     1         3   0.30           0.30
# 12:  C 2015     2         4     NA           0.30

关于r - 用时间序列或同一列中的相邻值替换NA值-data.table方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562104/

相关文章:

r - 使用 TraMineR 中的组从 seqrep 中提取单个代表性序列图

r - 根据 data.table 中附加列中的条件对同一列中的多行进行子集化

R,根据单独列中的值删除先前的行

r - 在 r 中创建二元运算符

r - 如何计算R中变量行之间的时间差?

r - 如何反向转换正常分数转换后的数据

r - ggplot 在 x 轴上分组

r - 将数据框分解成更小的数据框并保存

r - 在 ggplot2 中平滑 geom_tile map - 插值数据

scipy.interpolate.LinearNDInterpolator 在大型数据集上无限期挂起