【发布时间】:2019-05-05 15:45:27
【问题描述】:
我对 R 比较陌生,我遇到了一个代码,它用于将 NA 替换为我不完全理解的最新非 NA 值,请有人可以向我解释一下吗?:
这是代码:
z <- !is.na(a)
z <- z | !cumsum(z)
y <- a[z][cumsum(z)]
我有一个包含数字和 NA 的向量“a”:
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
为什么通过键入以下内容是 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] 1 1 1 1 3 4 5 5 5 5 5 5 5 5
-
我找到的代码是对的,只是我没看懂
-
请注意,zoo 包具有函数
na.locf和na.locf0(最后一次出现结转)来执行此操作。还有许多其他 na.* 函数也用于不同类型的 NA 替换。请注意,如果a中的值不递减,就像问题示例中的情况一样,那么cummax(ifelse(is.na(a), 0, a))也可以工作。
标签: r