【问题标题】:Unusual Behaviour of colon operator : in R冒号运算符的异常行为:在 R 中
【发布时间】:2021-02-07 13:54:00
【问题描述】:
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')。

【问题讨论】:

  • 在您的第一个问题得到回答后,您不应编辑您的帖子以提出完全不同的问题。而是开始一个新帖子。

标签: r string dplyr subset colon


【解决方案1】:

如果我们检查更通用的seq.default,它确实会将fromto 的类型从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)) 
...

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

对于其他参数 from:to 等价于 seq(from, to),并以 1 或 -1 的步长生成从 from 到 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, `2008` = 6:10, `2012` =  11:15, v1 = rnorm(5))
subset(df1, select = X2007:X2012)

【讨论】:

  • 能否请您也看看Edit 1?
  • @AkhileshwarSharma select 使用: 执行范围选项。它找到列名的位置,并获取从该位置到:的rhs名称的序列
  • 因此它必须重载在该位置使用的: 运算符,按照colnames(.)[grep(colnames(.)):grep(colnames(.)] 的方式进行操作。它可能没有在字符值上使用seq.default
【解决方案2】:

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

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

【讨论】:

  • 能否请您也看看Edit 1?
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2012-05-18
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多