我想要创建一个新的数据框架,df2,通过添加一个现有的数据框架,称为df,它的一个列的值称为column的行是非零的。
我一开始尝试的是:
df2 <- df[-(df$column == 0), ]然而,这是行不通的。所起的作用是:
df2 <- df[(df$column != 0), ]我明白为什么第二个工作,但我不明白为什么第一个没有工作,除了操作者超载。
具体来说,运行-(df$column == 0)和(df$column !=0)会返回不同的结果--前者甚至不是逻辑向量,而是逻辑向量(df$column == 0)的1倍。所以在任何地方我都想要值1,它有值0,而且无论我想要它有值0,它都有值-1。现在我知道这不会那么难解决,比如说,通过写作。
1 -(df$column == 0),但重点是,我没有期望操作符-会那样运行,我希望它作为集合补码操作符运行。(也就是说,我甚至没有预料到会出现问题,所以我没有考虑如何解决这个问题。)
的具体问题::R语言如何决定是否和何时将-算子解释为:(1)设置补语算子(2)减法算子(3)乘-1?
我发现的所有文档都只提到了操作符-作为(2)减法运算符的用法,但没有提到R如何在(1)和(3)之间消除歧义。
而且,我知道(2)和(3)在数学上差不多是等价的,但这并不意味着它们的实现是相同的。(例如MATLAB中的矩阵反演。)
发布于 2017-05-04 11:47:24
我认为出现复杂情况是因为您使用的值为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),]是一样的,因为在这两种情况下,您都要删除第一行(R中没有0索引)。
> 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根据上下文决定如何使用它。
免责声明
发布于 2017-05-04 11:25:45
-操作符是作为一个函数实现的,函数包含一个或两个参数。
> `-`
function (e1, e2) .Primitive("-")因此,表达式-a被解释为-(a),a - b被解释为-(a, b)。
使用一个参数,-返回加性逆(即。它逆转了论点的符号),并用两个参数减去。
> `-`(3)
[1] -3
> `-`(3, 1)
[1] 2它不做设置操作。
https://stackoverflow.com/questions/43780758
复制相似问题