如何在R中正确使用减号/设置补码运算符?

时间:2017-05-04 10:47:58

标签: r operator-overloading

我想创建一个新的数据框df2,通过对现有数据框进行子集化,将其称为df,按其列之一的值调用它column 1}},非零。

我最初尝试的是:

df2 <- df[-(df$column == 0), ]

然而,这不起作用。工作是什么:

df2 <- df[(df$column != 0), ]

我明白为什么第二个有效,但我不明白为什么第一个没有用,除了operator overloading

具体来说,运行-(df$column == 0)(df$column !=0)会返回不同的结果 - 前者甚至不是逻辑向量,而是逻辑向量(df$column == 0)的-1倍。所以在我想要值1的地方,它的值为0,而在我希望它的值为0的地方,它的值为-1。现在我知道通过写作来解决这个问题并不困难  1 -(df$column == 0),但重点是我不希望运算符-表现那样,我希望它表现为set complement运算符。 (即我甚至没有预料到会出现问题,所以我没有考虑如何解决这个问题。)

具体问题: R语言如何决定是否以及何时将-运算符解释为:(1)set complement operator(2)减法运算符(3)乘以 - 1?

我发现的所有文档仅解释了使用运算符-作为(2)减法运算符,但没有提到R如何在(1)和(3)之间消除歧义。

另外,我知道(2)和(3)或多或少在数学上是等价的,但这可能并不意味着它们的实现是相同的。 (例如,MATLAB中的矩阵求逆。)

2 个答案:

答案 0 :(得分:2)

-运算符是作为一个带有一个或两个参数的函数实现的。

> `-`
function (e1, e2)  .Primitive("-")

因此,表达式-a被解释为-(a),而a - b被解释为-(a, b)

使用一个参数-返回加法逆(即它反转参数的符号),并使用两个参数进行减法。

> `-`(3)
[1] -3
> `-`(3, 1)
[1] 2

它不进行设定操作。

答案 1 :(得分:2)

我认为会出现并发症,因为您使用的值为0和1,它们也是TrueFalse的等价数字。因此,我将尝试通过使用df只有两行和不同数字的案例来解释上面代码出了什么问题:

df<- data.frame(column = matrix(c(2,3), nrow=2))
> df
  column
1      2
2      3

调用(df$column==3)会返回两个逻辑值:

> df1$column==3
[1] FALSE  TRUE

由于TRUE=1FALSE=0,当您致电df[-(df$column == 3), ]时与调用df[-(c(0,1),]相同,因为在这两种情况下您都要移除第1行(没有0索引)在R)。

> df1[-(df1$column==3),]
[1] 3
> df1[-c(0,1),]
[1] 3

当您致电df[(df$column != 3),]时,反之亦然,因为这次您保留第一行。

> df[(df$column != 3),]
[1] 2
> df[c(1,0), ]
[1] 2

你要做的是删除df$column==3的行,但为了你需要知道它是什么行号,所以你需要它的索引。那是你调用which函数的时候。所以你会这样做:

df2 <- df[-which(df1$column == 3),]

除此之外,您对-R的使用方式的理解是正确的,我认为R根据上下文决定如何使用它。

<强>声明 我很抱歉这个长期的,也许是迂腐的答案,我只想做任何事情。