冒号运算符的异常行为:在 R 中

Unusual Behaviour of colon operator : in R

2000:2017

预期输出是一个向量,序列为 2000 到 2017,步长为 1。

输出:2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017

'2000':'2017'

然而,当我输入这个命令时,它仍然给我相同的输出。

输出:2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017

无法理解它是如何从字符生成序列的。

编辑 1:

最终,我想了解为什么下面的代码有效? X2007:X2011 怎么可能工作? select 函数来自 dplyr 包。

R code

我的数据也有与上图中提到的相似的列名,但我没有 'X'。我只有 2007、2008 等年

对我来说 select(Division, State, 2007:2011) 不起作用。

错误:无法对不存在的列进行子集化。 x 位置 2007、2008、2009、2010 和 2011 不存在。

但这行得通 select(Division, State, '2007':'2011').

据我所知,: 试图将其 'arguments' 强制转换为数字,所以这就是您获得该输出的原因。请注意 "a":"b" 给出:

Error in "a":"c" : NA/NaN argument
In addition: Warning messages:
1: NAs introduced by coercion 
2: NAs introduced by coercion 

如果我们检查更通用的 seq.default,它会将 fromto[=28 的类型从 character 更改为 numeric =]

...
if (!missing(from) && !is.finite(if (is.character(from)) from <- as.numeric(from) else from)) 
        stop("'from' must be a finite number")
    if (!missing(to) && !is.finite(if (is.character(to)) to <- as.numeric(to) else to)) 
...

沿着这条线,?: 的文档也这么说

For other arguments from:to is equivalent to seq(from, to), and generates a sequence from from to to in steps of 1 or -1. Value to will be included if it differs from from by an integer up to a numeric fuzz of about 1e-7. Non-numeric arguments are coerced internally (hence without dispatching methods) to numeric—complex values will have their imaginary parts discarded with a warning.


关于 subsetselect 的更新问题,如果该列是数字列名,即以数字开头,则它是一个 non-standard 列名,并且可以对其进行评估通过反引号完成

df1 <- data.frame(`2007` = 1:5, `2008` = 6:10, 
      `2012` =  11:15, v1 = rnorm(5), check.names = FALSE)
subset(df1, select = `2007`:`2012`)
#  2007 2008 2012
#1    1    6   11
#2    2    7   12
#3    3    8   13
#4    4    9   14
#5    5   10   15

dplyr::select

library(dplyr)
select(df1, `2007`:`2012`)
#   2007 2008 2012
#1    1    6   11
#2    2    7   12
#3    3    8   13
#4    4    9   14
#5    5   10   15

如果我们在开头有 X(当我们在没有 check.names = FALSE 的情况下读取数据时发生 - 默认情况下它是 TRUE。或者当我们使用 data.frame 创建数据集时 - 这里默认也是 check.names = TRUE)

df1 <- data.frame(`2007` = 1:5, `2008` = 6:10, `2012` =  11:15, v1 = rnorm(5))
subset(df1, select = X2007:X2012)