首页 > 解决方案 > 将 NA 添加到列的顶部

问题描述

我有一栏:

historic_unemployment <- c(0.0575, 0.1275, 0.151666666666667, 0.149166666666667, 0.135, 
0.104166666666667, 0.105833333333333, 0.106666666666667, 0.0725, 
0.0558333333333333, 0.0683333333333333, 0.0525, 0.055, 0.0408333333333333, 
0.0433333333333333, 0.0525, 0.0466666666666667, 0.0275, 0.0441666666666667, 
0.0508333333333333, 0.075, 0.0541666666666667, 0.0641666666666667, 
0.068) 

和另一个:

fitted values <- c(0.137023253252523, 0.130543486762516, 0.118735773791856, 0.109682083019129, 
0.10263866553188, 0.0837122001159384, 0.0580772899029193, 0.0531376546910345, 
0.0529651623490921, 0.0496381203970878, 0.0503647459492348, 0.0564917834527006, 
0.0565944213054081, 0.0445190657070135, 0.0335212669315816, 0.0357076018119224, 
0.0546613241321135, 0.0637659442126312, 0.0472901950013254, 0.0653375830289401, 
0.0677590453198192)

fit_values 列包含 21 个值,而history_unemployment 包含 24 个。我想 cbind fit_values 和history_unemployment 但由于它们的长度不同,我不能。虽然我可以找到有关将 NA 添加到列底部以使它们具有相同长度的信息,但我找不到任何关于将它们添加到列顶部的信息(在这种情况下它们应该在哪里,因为模型包含滞后值) .

我尝试制作一个新专栏

missing <- c("NA", "NA", "NA") 并使用 rbind() 将“missing”堆叠在“fitted_values”之上,但我最终得到一排 21 个 NA 并且“fitted_values”也是作为一排。

任何帮助将不胜感激!

标签: r

解决方案


自定义函数,当可以使用DRY 规则时,编写自己的函数总是很有价值的:


cbind_NA_top <- function(x, y) {
  stopifnot(is.vector(x) && is.vector(y))
  #this line have to be removed if vectors is not provided by symbols (variables)
  names <- c(as.name(substitute(x)), as.name(substitute(y)))
  x <- unlist(x)
  y <- unlist(y)
  len_y <- length(y)
  len_x <- length(x)
  dif <- len_y - len_x
  if (dif == 0) {
    res <- cbind(x, y)
  } else if (dif < 0) {
    res <- cbind(x, c(rep(NA, abs(dif)), y))
  } else if (dif > 0) {
    res <- cbind(c(rep(NA, abs(dif)), x), y)
  }
  colnames(res) <- names
  return(res)
}

cbind_NA_top(fitted_values, historic_unemployment)
cbind_NA_top(historic_unemployment, fitted_values)
l1 <- list(historic_unemployment)
l2 <- list(fitted_values)
cbind_NA_top(l1, l2)

我分配了一个填充了 NA 的空矩阵,因为它可以保护我们避免做错事。

使用c

mm <- matrix(NA, ncol = 2,  nrow = max(length(historic_unemployment), length(fitted_values)))

mm[, 1] <- historic_unemployment
mm[, 2] <- c(rep(NA_real_, nrow(mm) - length(fitted_values)) ,fitted_values)

mm

或者

mm <- matrix(NA, ncol = 2,  nrow = max(length(historic_unemployment), length(fitted_values)))

mm[, 1] <- historic_unemployment
mm[(nrow(mm) - length(fitted_values) + 1):nrow(mm), 2] <- fitted_values

mm

数据:

historic_unemployment <- c(0.0575, 0.1275, 0.151666666666667, 0.149166666666667, 0.135, 
0.104166666666667, 0.105833333333333, 0.106666666666667, 0.0725, 
0.0558333333333333, 0.0683333333333333, 0.0525, 0.055, 0.0408333333333333, 
0.0433333333333333, 0.0525, 0.0466666666666667, 0.0275, 0.0441666666666667, 
0.0508333333333333, 0.075, 0.0541666666666667, 0.0641666666666667, 
0.068) 

fitted_values <- c(0.137023253252523, 0.130543486762516, 0.118735773791856, 0.109682083019129, 
0.10263866553188, 0.0837122001159384, 0.0580772899029193, 0.0531376546910345, 
0.0529651623490921, 0.0496381203970878, 0.0503647459492348, 0.0564917834527006, 
0.0565944213054081, 0.0445190657070135, 0.0335212669315816, 0.0357076018119224, 
0.0546613241321135, 0.0637659442126312, 0.0472901950013254, 0.0653375830289401, 
0.0677590453198192)

推荐阅读