【问题标题】:in R, what's the difference between x[with(x, order(x$CHROM)), ] and x[ order(x$CHROM)) , ] [duplicate]在 R 中,x[with(x, order(x$CHROM)), ] 和 x[ order(x$CHROM)) , ] [重复] 有什么区别
【发布时间】:2020-08-16 04:51:08
【问题描述】:

我尝试了这两个命令,它们返回相同的结果,我只是想知道这两个 R 命令之间可能有什么区别:

x[with(x, order(x$CHROM)), ]
x[        order(x$CHROM) , ]

一个可以在线运行的例子是: https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/with

mtcars[with(mtcars, order(mtcars$cyl)), ]
mtcars[             order(mtcars$cyl) , ]

【问题讨论】:

  • 我认为第一个命令应该是:x[with(x, order(CHROM)), ]
  • 我试过你的版本,它产生了相同的结果。如果是这样,命令 x[with(x, order(CHROM)), ] 和 x[order(X$CHROM), ] 是否等效?
  • 通常您使用with(x),因此您不必输入x$。第一个命令似乎不必要地多余。基本上with() 什么都不做。
  • 我明白了。谢谢!

标签: r with-statement


【解决方案1】:

我认为第一个命令应该是:

mtcars[with(mtcars, order(cyl)), ]

第二个是:

mtcars[order(mtcars$cyl) , ]

它们都返回相同的结果并且是等效的,但是使用with 的好处是您不必在引用列名时一次又一次地引用数据框名称。

假设您想按 3 个变量排序。使用with 你可以这样做:

mtcars[with(mtcars, order(cyl, am, vs)), ]

没有with

mtcars[order(mtcars$cyl, mtcars$am, mtcars$vs) , ]

您可以选择使用什么,但它们都返回相同的结果:

identical(mtcars[with(mtcars, order(cyl, am, vs)), ],
          mtcars[order(mtcars$cyl, mtcars$am, mtcars$vs) , ])
#[1] TRUE

【讨论】:

    【解决方案2】:

    没有真正的区别。 with 是一种便利功能。

    示例 1

    你可以这样做

    iris[order(iris$Species), ]
    

    请注意,您必须使用$ 分隔符来引用Species 列。使用with,我们可以改为:

    with(iris, iris[order(Species), ])
    

    从最终用户的角度来看,上述操作与执行此操作基本相同:

    attach(iris)
    iris[order(Species), ]
    detach(iris)
    

    虽然我们应该避免使用attach - 我只是出于教学目的在这里展示它 - 因为它经常导致命名空间/范围的头痛(哪些变量可用 - 例如,如果你有一个名为Species 的变量并执行了上述attach() 调用,会有命名冲突)。使用with 可以避免这种事情,同时仍然允许您避免在任何地方使用$

    示例 2

    你可以写:

    plot(iris$Petal.Width, iris$Petal.Length)
    

    但是有:

    with(iris, plot(Petal.Width, Petal.Length))
    

    在这些小例子中使用with 并没有太大的收获。但是,如果您正在执行更复杂的函数调用,并且不断引用数据框的不同列,with 会派上用场。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2010-09-18
      • 2013-02-12
      • 2011-03-23
      相关资源
      最近更新 更多