我对r是相对较新的,我遇到了一个代码,用来用最新的非NAS值代替NAS,我不完全理解,请说明,任何人都可以解释对我?:
这是代码:
z <- !is.na(a)
z <- z | !cumsum(z)
y <- a[z][cumsum(z)]
我有一个载体" a",其中包含数字和NAS:
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
同样,如果我想要前3个元素:
> a[1:3]
[1] 1 NA NA
为什么通过键入以下内容是子集的真实值?是否不应该再次返回包括NAS在内的整个向量?因为z是所有布尔值的向量...
> a[z]
[1] 1 3 4 5 5 5 5
subset 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 boolean values
的第一个元素[1] 1
,但我没有获得第三行代码。
这是逻辑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''
中的真实值的相应元素获得了子集当我们使用 cumsum(z)
作为索引时,说前4个元素应为 a[z]
位置1处的值,第5个元素应来自 a[z]
的位置2,从 a[z]
的位置第3个位置,等等。简而言之,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)))
要了解其工作原理,最好在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("----------------")
}