【问题标题】:R na.approx error: need at least two non-NA values to interpolateR na.approx 错误:需要至少两个非 NA 值进行插值
【发布时间】:2018-05-04 03:47:24
【问题描述】:

样本数据

1/1/2000    NA  NA  NA  29.71   NA
1/2/2000    NA  NA  NA  NA  NA
1/3/2000    NA  NA  NA  NA  NA
1/4/2000    NA  NA  NA  29.25   NA
1/5/2000    NA  NA  NA  30.28   NA
1/6/2000    NA  NA  NA  27.66   NA
1/7/2000    NA  NA  NA  27.22   NA
1/8/2000    NA  NA  NA  27.27   NA
1/9/2000    170 4.1 NA  5.24    NA
1/10/2000   NA  NA  NA  NA  NA
1/11/2000   NA  NA  NA  27.65   NA
1/12/2000   NA  NA  NA  28.28   100.57
1/13/2000   NA  NA  NA  27.52   NA

我正在尝试插入很多 NA 值。

我有唯一的日期(键),但大多数 [其他] 数据列以 NULL/NA 值开始/结束(combined_data_z[,a])。我想根据日期插入这些 [其他] 列的空值,尝试时出现此错误

Error in approx(x[!na], y[!na], xout, ...) :    need at least two
  non-NA values to interpolate
library(zoo)

#start with 2 because 1st column is date
a=2
for (i in parsedList)
{

dates <- combined_data_z[,1]
test1 <- combined_data_z[,a]
test1_z <- zoo(test1)
test1_z_approx <- na.fill(na.approx(test1_z, x=dates, rule=2, na.rm = FALSE), "extend")
#print(test1_z_approx)

a=a+1

}

更新:显然它与 for 循环有关,当我删除它并使用 print 语句进行测试并从那里构建时,我发现它在不括在括号中时有效(但我需要循环)。

dates <- combined_data_z[,1]
test1 <- combined_data_z[,4]
test1_z <- zoo(test1)
test1_z_approx <- na.fill(na.approx(test1_z, x=dates, rule=2, na.rm = FALSE), "extend")
print(test1_z_approx)

【问题讨论】:

  • 您能否检查所有列是否至少有 2 个非缺失值。看起来您的数据集中至少有一列有 1 个或没有非缺失值。要检查列中有多少非缺失值,您可以在循环中执行 sum(!is.na( combine_data_z[,a]))
  • 我确认了。我的数据集的副本可以在这里找到:thistleknot.sytes.net/wordpress/wp-content/uploads/2018/04/…

标签: r interpolation


【解决方案1】:

对于您在 cmets 中提供的以下数据集,此方法有效:

library(zoo)
combined_data_z <- read.csv(file="http://thistleknot.sytes.net/wordpress/wp-content/uploads/2018/04/output_NoNA.csv")


test1_z_approx <- matrix(NA, ncol=ncol(combined_data_z)-2, nrow = nrow(combined_data_z))
for (i in 3:ncol(combined_data_z))
{

  dates <- combined_data_z[,1]
  test1 <- combined_data_z[,i]
  test1_z <- zoo(test1)
  test1_z_approx[,i-2] <-as.matrix( na.fill(na.approx(test1_z, x=dates, rule=2, na.rm = FALSE), "extend"))[,1]


}

如果您的数据集以“日期”列开头,那么代码将如下所示:

head(combined_data_z)
#          date CPIAUCSL UNRATE MEHOINUSA672N INTDSRUSM193N CIVPART
#    1 1/1/2000    169.3      4         58544             5    67.3
#    2 1/2/2000       NA     NA            NA            NA      NA
#    3 1/3/2000       NA     NA            NA            NA      NA
#    4 1/4/2000       NA     NA            NA            NA      NA
#    5 1/5/2000       NA     NA            NA            NA      NA
#    6 1/6/2000       NA     NA            NA            NA      NA

test1_z_approx <- matrix(NA, ncol=ncol(combined_data_z)-1, nrow = nrow(combined_data_z))
for (i in 2:ncol(combined_data_z))
{

  dates <- combined_data_z[,1]
  test1 <- combined_data_z[,i]
  test1_z <- zoo(test1)
  test1_z_approx[,i-1] <-as.matrix( na.fill(na.approx(test1_z, x=dates, rule=2, na.rm = FALSE), "extend"))[,1]

}

head(test1_z_approx)
#         [,1]     [,2]  [,3]     [,4]     [,5]
#[1,] 169.3000 4.000000 58544 5.000000 67.30000
#[2,] 224.0420 4.033100 59039 2.844406 64.07145
#[3,] 196.4639 3.959895 59039 4.579983 65.57215
#[4,] 188.9426 3.939930 59039 5.053322 65.98144
#[5,] 186.4355 3.933275 59039 5.211101 66.11786
#[6,] 183.9284 3.926620 59039 5.368881 66.25429

【讨论】:

  • 当我导出到 csv 时,列出带有不正确标题的导出,包括一个额外的行列,并且没有日期列。在现实生活中,我没有使用 csv,这个 csv 是一个名为 df3 的数据框的导出。我能够从原始代码中的 combined_data_z 进行更改。 :)
  • 我真希望我不使用那个 .csv。我只提供它作为示例。我很难尝试将其恢复为我的代码(df3)中的数据框。例如, df3 没有迭代值的列。但 csv 确实如此。正确复制它的唯一方法是重新编码 csv 写入并重新导入它。
  • 您的代码将我的 .csv 转换为按列矩阵,这让我很失望。
  • 我不确定您要以哪种形式保存输出。您的原始代码在每次迭代时都会覆盖先前的值,因此我将其放入矩阵中。您可以将其调整为适合您的任何内容,即 data.frame。
【解决方案2】:

感谢 Katia 的帮助(特别是我的 x 和 y 需要在单独的数据帧中)

combined_data_z <- df3
#https://stackoverflow.com/a/50173660/1731972

#file begins with numeric iterations
#ncol(combined_data_z)

dates <- combined_data_z[1]

print(dates)


#important to start at 2!, otherwise na.approx will not work!

#either copy from 2: on or copy whole and drop first column (date)
#test1 <- combined_data_z[c(2:length(parsedList)+1)]

#drop date
test1 <- combined_data_z
test1[1] <- NULL

print(test1)                  

#wtf, had to add data.frame today!
test1_z <- zoo(data.frame(test1))

date_z <- zoo(data.frame(dates))

print(test1_z)

#colnames(test1_z)

print(dates)

test1_z_approx <- na.fill(na.approx(test1_z, dates$date, rule=2, na.rm = FALSE), "extend")

print(test1_z_approx)

#new <- NULL
print(new)
new <- c(data.frame(dates),data.frame(test1_z_approx))
print(new)

write.csv(new, file = "output_test.csv")

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2016-02-15
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多