R子集向量来替换NA

时间:2019-05-05 15:45:28

标签: r

我对R还是比较陌生,我遇到了一个代码,该代码用于用我不完全了解的最新非NA值替换NA,请问有人可以向我解释吗?

这是代码:

z  <- !is.na(a)                  
z  <- z | !cumsum(z)             
y  <- a[z][cumsum(z)]

我有一个向量“ a”,其中包含数字和NA:

a<-c(1,NA,NA,NA,3,4,5,NA,5,5,5,NA,NA,NA)

通过运行第一行,我得到“ z”  是“ a”向量的布尔值:

> z
 [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

所以现在我知道,如果要访问向量的第一个元素,我可以使用符号[[]来对数字1进行子集设置:

> a[1]
[1] 1

类似地,如果我想要前三个元素:

> a[1:3]
[1]  1 NA NA

为什么通过键入以下命令来替换TRUE值? 是否不应该再次返回包括NA在内的整个向量?因为z是所有布尔值的向量...

> a[z]
[1] 1 3 4 5 5 5 5

将FALSE作为子集显然是

> a[!z]
    [1] NA NA NA NA NA NA NA

最后,我可以理解累积函数“ cumsum”:

> cumsum(z)
 [1] 1 1 1 1 2 3 4 4 5 6 7 7 7 7

但是我不明白为什么输入:

> a[z][cumsum(z)]

它返回:

[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

“ [] []”是什么意思? 我知道例如 通过输入

> a[z][1]

我可以访问TRUE布尔值的子集的第一个元素

[1] 1

但是我没有得到第三行代码。

1 个答案:

答案 0 :(得分:2)

这里的“ z”是逻辑vector,即具有TRUE / FALSE值。当我们执行cumsum(累积和)时,在每个“ TRUE”值处,它都会加1

cumsum(z)
[1] 1 1 1 1 2 3 4 4 5 6 7 7 7 7

现在,让我们来看一下

a[z]
#[1] 1 3 4 5 5 5 5

在这里,“ a”的值由“ z”中TRUE值的相应元素组成的子集。

当我们使用cumsum(z)作为索引时,就是说前4个元素应该是a[z]中位置1的值,第5个元素应该是a[z]中位置2的值,从a[z]的位置3开始第6位,依此类推...简而言之,a[z]中的值是根据cumsum(z)的索引进行复制的

a[z][cumsum(z)]
#[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

rep

相同
rep(a[z], c(4, 1, 1, 2, 1, 1, 4))
#[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

rep(a[z], tabulate(cumsum(z)))

要了解其工作原理,最好在print循环中使用一些for语句

for(i in cumsum(z)) {
   cat("cumulative sum vector", paste(cumsum(z), collapse=","), sep="\n")
  cat(paste0("cumulative sum of z index i: ", i), sep="\n")
  cat("value of a[z] vector:", paste(a[z], collapse=","), sep= "\n")
  cat("value of a[z] from indexing", a[z][i], sep="\n") 
  cat("----------------")
 }