【问题标题】:R subsetting vector to replace NAsR 子集向量以替换 NA
【发布时间】: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.locfna.locf0(最后一次出现结转)来执行此操作。还有许多其他 na.* 函数也用于不同类型的 NA 替换。请注意,如果a 中的值不递减,就像问题示例中的情况一样,那么cummax(ifelse(is.na(a), 0, a)) 也可以工作。

标签: r


【解决方案1】:

这里的“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,第6个元素应该是位置3的值a[z] 等等...简而言之,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("----------------")
 }

【讨论】:

  • 很好的解释,所以基本上使用函数“cumsum”作为索引,有趣
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2020-12-05
  • 2015-07-09
  • 1970-01-01
  • 2020-07-15
  • 2021-10-15
相关资源
最近更新 更多