【问题标题】:How can I pad a vector with NA from the front?如何从前面用 NA 填充向量?
【发布时间】:2016-09-14 08:32:15
【问题描述】:

我想创建一个现有的矢量大小n 并使用NA。我知道我可以像这样在向量的末尾填充:

v1 <- 1:10
v2 <- diff(v1)
length(v2) <- length(v1)
v2
# 1 1 1 1 1 1 1 1 1 NA 

但我想在开始时填写NA,而不是以通用的方式。我的意思是对于这个特定的例子,我可以

v2 <- c(NA, diff(v1))
# NA 1 1 1 1 1 1 1 1 1 

但我希望存在一些提供类似v2 &lt;- pad(v2, n=length(v1), value=NA) 的基本 R 函数或库

有没有类似的东西我可以使用或者我需要定义我自己的功能:

pad  <- function(x, n) { # ugly function that doesn't keep the attributes of x
    len.diff <- n - length(x)
    c(rep(NA, len.diff), x) 
}

pad(1:10, 12) # NA NA 1 2 3 4 5 6 7 8 9 10

【问题讨论】:

  • 我不认为你的函数是丑陋的。
  • 我不认为你的功能是丑陋的。为什么不设置 n=1 然后你就解决了你的问题。
  • 对于NA 填充,您也可以使用v1 &lt;- 1:10; v2 &lt;- diff(v1); length(v2) &lt;- length(v1); v2[order(!is.na(v2))]
  • 也许并不难看,但我宁愿使用一些现有的基础 R / 库来代替(如果它们存在的话)。

标签: r


【解决方案1】:

假设v1 具有所需的长度并且v2 更短(或相同的长度)这些左侧填充v2NA 值到v1 的长度。前四个假设为数字向量,尽管可以通过将代码中的 NA*v1 替换为 rep(NA, length(v1)) 来修改它们以更普遍地工作。

replace(NA * v1, seq(to = length(v1), length = length(v2)), v2)

rev(replace(NA * v1, seq_along(v2), rev(v2)))

replace(NA * v1, seq_along(v2) + length(v1) - length(v2), v2)

tail(c(NA * v1, v2), length(v1))

c(rep(NA, length(v1) - length(v2)), v2)

第四个是最短的。除了将v1NA 值相乘之外,前两个和第四个不涉及任何显式算术计算。第二个可能很慢,因为它涉及rev 的两个应用程序。

【讨论】:

    【解决方案2】:

    一个选项是 diff 来自 zoo 也有 na.pad

    library(zoo)
    as.vector(diff(zoo(v1), na.pad=TRUE))
    #[1] NA  1  1  1  1  1  1  1  1  1
    

    【讨论】:

    • 这在我的示例中是完美的,因为我正在做一个差异,但它不能解决将现有向量 v2 填充为与 v1 相同大小的更普遍问题。 (想象一下我一开始没有使用diff()
    • @ecerulm 你的功能也不错。另一个变体是c(rep(NA, sum(is.na("length&lt;-"(v2, length(v1))))), v2)
    【解决方案3】:

    在 v2 开始时将 nrValues 定义为您可以使用的元素数量:

    n <- length(v1) v2 <- c(rep(NA,nrValues),v1[nrValues:n])

    我不熟悉执行此操作的函数,因此如果您打算多次执行此操作,我会创建您自己的函数。

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 2019-03-31
      • 2020-03-06
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多