我想创建一个新的数据框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中的矩阵求逆。)
答案 0 :(得分:2)
-
运算符是作为一个带有一个或两个参数的函数实现的。
> `-`
function (e1, e2) .Primitive("-")
因此,表达式-a
被解释为-(a)
,而a - b
被解释为-(a, b)
。
使用一个参数-
返回加法逆(即它反转参数的符号),并使用两个参数进行减法。
> `-`(3)
[1] -3
> `-`(3, 1)
[1] 2
它不进行设定操作。
答案 1 :(得分:2)
我认为会出现并发症,因为您使用的值为0和1,它们也是True
和False
的等价数字。因此,我将尝试通过使用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=1
和FALSE=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
根据上下文决定如何使用它。
<强>声明强> 我很抱歉这个长期的,也许是迂腐的答案,我只想做任何事情。