【问题标题】:CRAN-R: Subset a dataframe bug or violation of semantics?CRAN-R:子集数据帧错误或违反语义?
【发布时间】:2012-11-21 19:23:57
【问题描述】:

今天,由于数据帧子集操作,我在代码中遇到了一个错误。我想知道我发现的问题是错误还是违反了 R 语义。

我正在运行带有 R 2.15.2-61015(不给糖就捣蛋)的 RHEL x86_64。我正在使用基本包中的子集操作。

以下代码应该是可重现的,并且它是在为此测试启动的干净的 R 控制台上运行的。

>teste <-data.frame(teste0=c(1,2,3),teste1=c(3,4,5))
>teste0<-1
>teste1<-1

>subset(teste,teste[,"teste0"]==1 & teste[,"teste1"]==1)
[1] teste0 teste1
<0 rows> (or 0-length row.names)

>subset(teste,teste[,"teste0"]==teste0 & teste[,"teste1"]==teste1)
teste0 teste1
1      1      3
2      2      4
3      3      5

但是,如果我在子集操作之外运行逻辑代码:

>teste[,"teste0"]==teste0 & teste[,"teste1"]==teste1
[1] FALSE FALSE FALSE

我希望这两个子集操作都会产生一个空数据帧。但是,第二个返回完整的数据帧。这是一个错误还是我错过了 R 环境和命名空间的一些内容?

感谢您的帮助, 米格尔

【问题讨论】:

  • 这绝对不是bug。

标签: r subset


【解决方案1】:

在此声明中:

subset(teste,teste[,"teste0"]==teste0 & teste[,"teste1"]==teste1)

teste0 表示 teste$teste0。 teste1 也一样。

在此声明中:

teste[,"teste0"]==teste0 & teste[,"teste1"]==teste1

teste0 和 teste1 是您在上面定义的向量(不是数据框的成员)。

【讨论】:

  • @Mathew 谢谢!你能给我推荐一个我可以详细阅读的资料吗?
  • 查看帮助(子集),尤其是示例。
  • @Mathew 好吧,这让我觉得自己很愚蠢......基本上我定义的向量在子集函数中改变了它们的性质。我想知道的是,这种情况通常在 R 中何时发生。不仅在这种特殊情况下。因为我认为这是很常见的事情?再次感谢。
  • @mmgm 您可以先阅读scope 如何在 R 中工作,this 的问题可能会有所帮助。
  • @mmgm:subset 函数创建了一个本地环境,其中列名被添加到搜索路径中并且不需要被引用。这就是所谓的“非标准评估”,它实际上发生了很多。即使键入 help(subset) 也是一个示例,因为“标准”调用将是 help('subset')。使用withwithintransform 可以看到类似的行为。
猜你喜欢
  • 2015-08-22
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多