【问题标题】:R appends 'NA' when slicing vectorR在切片向量时附加'NA'
【发布时间】:2020-01-30 16:42:02
【问题描述】:

我使用 R 尝试制作sc 的切片并将其放入sci。然而,出于某种原因,R 将“NA”附加到sci。为什么?发生了什么事,我做错了什么?在 Python 中,我确实得到了正确的结果。

> sc
 [1] 12646      1295       131        20         0         0         1
> i
[1] 1
> sc[1+i:length(sc)]
 [1] 1295      131       20        0        0        1       NA
> length(sc)
[1] 7
> length(sci)
[1] 7

【问题讨论】:

  • @SaurabhChauhan 可以发布问题和答案。 stackoverflow.com/help/self-answer
  • 发生的事情是您指的是矢量sc 元素1 + length(sc)(忘记i)。该元素不存在,因此 R 使用 NA 值扩展了向量。

标签: r slice


【解决方案1】:

R 使用 Python 的向量/数组切片语法(使用 start:stop 表示法),但是底层机制与 Python 的完全不同。 在 Python 中,这种表示法真正纯粹是一种切片语法,在两个用于索引可迭代对象的 [] 括号之外没有任何意义:

>>> 1:5
SyntaxError: invalid syntax

您还会注意到,冒号 : 之前的任何内容都被视为 start 的一部分(冒号之后的任何内容都是 stop 的一部分):

>>> a = [1, 2, 3, 4, 5]
>>> i = 1
>>> a[1+i:len(a)]
[3, 4, 5]

并不是说 Python 使用从零开始的索引。

但是在 R 中,start:stop 即使在切片之外也有自己的含义,并且被视为自己的实体,您可以在其上进行算术运算:

1:5
[1] 1 2 3 4 5
1+1:5
[1] 2 3 4 5 6
1+1:5/2
[1] 1.5 2.0 2.5 3.0 3.5

所以这回答了正在发生的事情的问题。当您键入 1+i:length(sc) 时,1 将添加到 i:length(sc) 中的每个元素。 相反,写(1+i):length(sc)(使用括号定义start)会产生你想要的结果。

【讨论】:

  • 此问题和“答案”属于基本 R operator syntax & precedence(另请参阅官方R Language Definition on CRAN 的相关部分)。我不认为这需要一个独立的答案。
  • 我对第一句话有疑问:“R 使用向量/数组切片语法......使用 start:stop 表示法”。这在技术上是不正确的,因为 R 中没有“切片”概念。当你设置子集时,你告诉你想要保留的原始向量的索引。 start:stop 表示法只是创建了一个向量,而该向量又可以用于子集化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2020-12-21
  • 2017-08-11
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多