冒号运算符的异常行为:在 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
,它会将 from
和 to
[=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.
关于 subset
和 select
的更新问题,如果该列是数字列名,即以数字开头,则它是一个 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)
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
,它会将 from
和 to
[=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.
关于 subset
和 select
的更新问题,如果该列是数字列名,即以数字开头,则它是一个 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)