微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决冒号运算符的异常行为: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可能如何工作?选择功能来自dplyr软件包。

R code

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

对我来说,选择(州,州/省,2007:2011)无效。

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

但这适用于选择(分区,州,“ 2007”:“ 2011”)。

解决方法

如果我们检查更通用的seq.default,则会将characternumeric的类型从from更改为to

...
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)) 
...

与此同时,?:的文档也是如此

对于from:to的其他参数,它等效于seq(from,to),并以1或-1的步长生成从from到to的序列。如果值to从整数到大约1e-7的数字模糊不等,则将包括在内。非数字参数在内部被强制转换为数字(因此,无需使用分派方法)—复杂值的虚部将被警告丢弃。


关于用subsetselect更新的问题,如果该列是数字列名,即它以数字开头,则它是非标准列名,可以通过反引号对它们进行评估

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,v1 = rnorm(5))
subset(df1,select = X2007:X2012)
,

据我所知,:试图将其“参数”强制为数字,因此这就是为什么要获得该输出的原因。请注意,"a":"b"给出:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。