gpt4 book ai didi

R通过向量不一致行为的空索引下降

转载 作者:行者123 更新时间:2023-12-04 11:44:57 24 4
gpt4 key购买 nike

考虑从向量中移除那些与特定条件集匹配的元素。预期的行为是删除匹配的那些,特别是,如果没有匹配,则删除一个:

> d = 1:20
> d
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> d[-which(d > 10)]
[1] 1 2 3 4 5 6 7 8 9 10
> d[-which(d > 100)]
integer(0)

我们在这里看到最后的语句既做了一些非常出乎意料的事情,又在没有警告的情况下默默地隐藏了错误。

我最初认为这是一个不受欢迎的(但一致的)选择空索引选择向量的所有元素的结果

http://stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html

as 通常用于例如选择矩阵的第一列 m,通过书写

m[ , 1]

然而,这里观察到的行为与将空向量解释为“无元素”而不是“所有元素”是一致的:

> a = integer(0)

选择“无元素”完全符合预期:

> v[a]
numeric(0)

但是删除“无元素”不会:

> v[-a]
numeric(0)

对于空向量,既不选择元素又删除所有元素需要不一致。

显然可以通过检查 which() 返回非零长度或使用此处所述的逻辑表达式来解决此问题 In R, why does deleting rows or cols by empty index results in empty data ? Or, what's the 'right' way to delete?

但我的两个问题是:

  1. 为什么行为不一致?
  2. 为什么它在没有错误或警告的情况下默默地做错事?

最佳答案

这不起作用,因为 which(d > 100)-which(d > 100)是同一个对象:空向量和该空向量的负数之间没有区别。

例如,假设您做了:

d = 1:10

indexer = which(d > 100)
negative_indexer = -indexer

这两个变量将是相同的(这是唯一一致的行为 - 将空向量的所有元素都变为负值使其保持不变,因为它没有元素)。

indexer
#> integer(0)
negative_indexer
#> integer(0)
identical(indexer, negative_indexer)
#> [1] TRUE

在那个时候,你不能指望d[indexer]d[negative_indexer]给出不同的结果。也没有提供错误或警告的地方:它不知道什么时候传递一个空向量是你“指的”那个空向量的负版本。


解决方案是,对于子集化,您没有理由需要 which()根本:你可以使用 d[d > 10]而不是你原来的例子。因此,您可以使用 !(d > 100)d <= 100为你的负面索引。这符合您的预期,因为 d > 10!(d > 100)是逻辑向量而不是索引向量。

关于R通过向量不一致行为的空索引下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com