如何将值分配给 is.na() 的输出?

Posted

技术标签:

【中文标题】如何将值分配给 is.na() 的输出?【英文标题】:How can values be assigned to the output of is.na()? 【发布时间】:2019-11-11 00:55:29 【问题描述】:

以下与R语言有关。

x1 <- c(1, 4, 3, NA, 7)
is.na(x1) <- which(x1 == 7)

我不明白,最后一行的 LHS 为您提供了一个布尔向量,而 RHS 是一个值(在这种情况下,x ==7, 5 的索引)。那么给布尔向量赋值5是什么意思呢?

【问题讨论】:

仔细阅读?is.na。这是一个非常令人困惑的功能 TBH 我还没有真正使用它 【参考方案1】:

is.na 来自文档返回:

应用于原子向量的 is.na 的默认方法返回与其参数 x 长度相同的逻辑向量,对于标记为 NA 的元素包含 TRUE,或者对于数字或复数向量,包含 NaN,否则为 FALSE。

因此,通过创建一个逻辑向量(您实质上是在说无论索引是TRUE,这应该是一个NA

通过将这些索引“匹配”到来自which 的相应索引,您可以将后者转换为NAs,无论FALSE 因此发生了变化。

付诸实践:

这是is.na(x1)的输出:

is.na(x1)
[1] FALSE FALSE FALSE  TRUE FALSE

which(x==7)的对应输出:

which(x1 == 7)
[1] 5

组合后,位置 5 的元素现在将变为 NA,因为它已被赋予逻辑 is.na(),返回 TRUE

is.na(x1) <- which(x1 == 7)
 x1
[1]  1  4  3 NA NA

上面将第一个索引变成了NAappends两个NAs,从而使索引7和NA

这可以通过以下方式最好地看到:

is.na(x1) <- c(1,7)
 x1
[1] NA  4  3 NA  7 NA NA

与文档中的此示例进行比较:

(xx <- c(0:4))
is.na(xx) <- c(2, 4)
 xx
[1]  0 NA  2 NA  4

从上面可以看出,c(2,4) 遵循xx 中的原始索引,因此其余的变为NAs。

【讨论】:

是不是很奇怪?我从未注意到我所研究的语言中的这种行为。 a.) 在 LHS (is.na(x)) 中,我们只有一个布尔向量而不是 x。我们无权访问变量 x。 b.) 而且它不只是关于 (which(x==7),即使你直接在 RHS 上写 5,结果也会一样。它本质上归结为:c(FALSE,FALSE,FALSE,TRUE, FALSE) = 5 这是错误的。 您将索引设置为NA。如果使用 5,它将索引 5 设置为 NA。重点是我们使用的是索引而不是值。 对不起,我认为你没有明白我的意思。这两个命令在单独评估和重写时只不过是 c(FALSE,FALSE,FALSE,TRUE,FALSE) = 5。这怎么可能是真的?我认为 R 已经做了一些特殊的规定来处理 is.na() 的输出。否则,它没有任何意义。 请阅读我的回答(再次??),让我知道,让我知道我应该在哪里特别重新阐述。

以上是关于如何将值分配给 is.na() 的输出?的主要内容,如果未能解决你的问题,请参考以下文章

在为选定列分配变量后,如何删除一些具有 NA 值的行?

如何正确地将值分配给数组(结构类型)元素?

如何将值分配给数组中的随机位置?

如何将值向量分配给R中igraph中的顶点标签?

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

熊猫,我怎样才能避免使用 iterrow (如何根据来自另一个数据帧的值将值分配给数据帧中的新列)