【问题标题】:Replace NAs in one vector with sequential elements of another vector用另一个向量的顺序元素替换一个向量中的 NA
【发布时间】:2015-01-15 10:11:09
【问题描述】:

我想用序列中的元素替换向量的 NA 元素,例如:

x <- c(1, NA, 5, NA, NA, 2, 12, NA)
replace.seq <- -1:-4  # Can assume length(replace.seq) == sum(is.na(x))
goal <- c(1, -1, 5, -2, -3, 2, 12, -4)

什么是执行此操作的有效方法?我宁愿避免对x 进行排序。

【问题讨论】:

  • x[is.na(x)] &lt;- replace.seq
  • 呃,谢谢@akrun!
  • 我可以建议您将标题更改为“将一个向量中的 NA 替换为另一个向量的顺序元素”吗?只是让它更清楚一点。为了比较,zoo::locfNA 替换为同一个向量中的前瞻值;颠倒向量的顺序将允许回溯填充。
  • @CarlWitthoft 同意,这更清楚。现在改了,谢谢。
  • @akrun stackoverflow.com/questions/31423931/…你能帮忙解决这个问题吗?

标签: r vectorization


【解决方案1】:

每个@akrun:

x[is.na(x)] <- replace.seq

【讨论】:

  • 应该指出R会根据需要回收值,所以如果你的输入向量中replace.seq中的值比NAs少,你应该小心你想要做什么.
  • 或者:x &lt;- ifelse(is.na(x),replce.seq,x),但上面的答案是更传统的方式
  • @Sven 真的吗? x[is.na(x)] &lt;- replace.seq;y &lt;- ifelse(is.na(x),replce.seq,x); identical(x,y) 对我来说等于 TRUE
  • @Jthorpe 是的,真的。在第一个命令之后,x 不包含任何NAs。试试x &lt;- c(1, NA, 5, NA, NA, 2, 12, NA); y &lt;- ifelse(is.na(x), replace.seq, x); x[is.na(x)] &lt;- replace.seq; identical(x,y)
  • ifelse 失败,因为它根据x 中的索引回收replace.seq 的值。它返回c(1, -2, 5, -4, -1, 2, 12, -4),其中第一个-2是因为它是x的第二个元素,-4作为第四个元素,-1再次作为第五个元素(回收到第一个),等等。
【解决方案2】:

你可以使用replace:

x <- replace(x, is.na(x), replace.seq)

【讨论】:

  • 谢谢,如果你想产生一个新的向量,这会更好。
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2017-11-12
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多