用R子集向量代替NAs
我对R比较陌生,我遇到了一个代码,它用来用我不完全理解的最新非NAs值替换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
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("----------------")
}