用R子集向量代替NAs

用R子集向量代替NAs,r,R,我对R比较陌生,我遇到了一个代码,它用来用我不完全理解的最新非NAs值替换NAs,请大家给我解释一下: 代码如下: z <- !is.na(a) z <- z | !cumsum(z) y <- a[z][cumsum(z)] 现在我知道,如果我想访问向量的第一个元素,我可以使用符号“[”来子集数字1: > a[1] [1] 1 类似地,如果我想要前3个元素: > a[1:3] [1] 1 N

我对R比较陌生,我遇到了一个代码,它用来用我不完全理解的最新非NAs值替换NAs,请大家给我解释一下:

代码如下:

z  <- !is.na(a)                  
z  <- z | !cumsum(z)             
y  <- a[z][cumsum(z)]
现在我知道,如果我想访问向量的第一个元素,我可以使用符号“[”来子集数字1:

> a[1]
[1] 1
类似地,如果我想要前3个元素:

> a[1:3]
[1]  1 NA NA
为什么键入以下内容就是对真值进行子集设置? 它不应该再次返回包括NAs在内的整个向量吗?因为z是所有布尔值的向量

> a[z]
[1] 1 3 4 5 5 5 5
显然是错误的

> a[!z]
    [1] NA NA NA NA NA NA NA
最后,我可以理解累积函数“cumsum”:

但我不明白为什么键入:

> a[z][cumsum(z)]
它返回:

[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5
“[]”是什么意思? 例如,我知道 通过打字

> a[z][1]
我可以访问子集真布尔值的第一个元素

[1] 1

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

这里的'z'是一个逻辑的
向量
,即有真/假值。当我们做了
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”中的真值的对应元素得到子集

当我们使用
cumsum(z)
作为索引时,它是说前4个元素应该是
a[z]
位置1处的值,第5个元素应该是
a[z]
位置2处的值,第6个元素应该是
a[z]
位置3处的值,依此类推……简言之,
a[z]中的值
根据
cumsum(z)

这与
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


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

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("----------------")
 }

输入为A输出为[1]1 1 1 3 4 5 5 5 5 5 5 5 5 5 5 5我发现的代码是正确的,只是我不理解它。请注意,zoo软件包具有函数
na.locf
na.locf0
(上一次结转)要做到这一点,还有许多其他na.*函数也用于不同类型的na替换。请注意,如果
a
中的值与问题示例中的情况一样是非递减的,那么
cummax(ifelse(is.na(a),0,a))
也可以工作。很好的解释,因此基本上函数“cumsum”被用作索引,很有趣
a[z]
#[1] 1 3 4 5 5 5 5
a[z][cumsum(z)]
#[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5
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)))
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("----------------")
 }