【问题标题】:Inserting removed data back into a vector, at its original location, in R将删除的数据插入向量中,在其原始位置,在 R
【发布时间】:2026-02-17 09:40:01
【问题描述】:

在 R 中,我有一个向量,我想删除某些元素,对过滤后的数组应用计算,然后将删除的元素重新插入。

比如我想去掉NaNs,然后再应用cumsum

> v = c(1, NaN, 2, NaN, 3)
> (nans = is.nan(v))
[1] FALSE  TRUE FALSE  TRUE FALSE
> (filtered = v[!nans])
[1] 1 2 3
> (summed = cumsum(filtered))
[1] 1 3 6

现在,我想要将NaNs 插入到向量中的原始位置,给我c(1, NaN, 3, NaN, 6)

这样做的天真方法是:

> summed[nans] = v[nans]
> summed
[1]   1 NaN   6 NaN  NA

但显然这是错误的。因为summed 的索引与v 不同,我不能简单地重复使用nans 逻辑向量。

请注意,这只是一个简化的示例。在我真正的问题中,删除的值并不完全相同(NaN),我也不知道将删除多少个值,也不知道v 是多长时间。

所以我的问题是,我如何才能反转我在过滤向量时所做的原始逻辑索引,并取回处理后的数组,但又插入了NaNs?我对任何核心 R 或库解决方案都很满意。

【问题讨论】:

    标签: r vector indexing


    【解决方案1】:

    使用:

    v[!nans] = summed
    v
    #[1]   1 NaN   3 NaN   6
    

    !nans 反转布尔向量,给出索引,其中值不是NaNsummed 是要替换的向量。

    【讨论】:

      【解决方案2】:

      您可以使用[<- 重新插入NaN

      "[<-"(rep(NaN, length(v)), !nans, summed)
      #[1]   1 NaN   3 NaN   6
      

      实际上我在这里创建了一个NaN 的向量并插入summed 的值。

      另外,v 中的 NaN 可以像这样使用:

      "[<-"(v, !nans, summed)
      #[1]   1 NaN   3 NaN   6
      

      【讨论】: