布尔运算中的dplyr row_number()行为

时间:2014-08-21 16:49:51

标签: r dplyr

在回答another question时,我遇到了dplyr::row_number()的行为,这对我来说有点令人惊讶,我想知道这应该是行为还是出于什么原因。这是一个例子:我想通过OR或AND连接函数row_number()进行两个逻辑测试。这是一个简单的例子,没有多大意义,但说明了我的意思:

library(dplyr)
iris %>%
  mutate(newcol = row_number() - Sepal.Length < 0 | row_number() - Petal.Length < 0)
Error in rank(x, ties.method = "first") : 
  argument "x" is missing, with no default

如您所见,它会返回错误。单独运行布尔测试的每个部分运行完全正常。并且,为了解决这个问题,我需要添加第二个 row_number应该引用的列,例如这两个修改都有效:

iris %>%
  mutate(newcol = row_number() - Sepal.Length < 0 | row_number(Species) - Petal.Length < 0)

iris %>%
  mutate(newcol = row_number(Species) - Sepal.Length < 0 | row_number(Species) - Petal.Length < 0)

我想知道这是否是程序性的必要性,或者为什么row_number不仅仅在|之后使用相同的输入。有人能帮助我理解这个吗?

(我正在运行dplyr 0.2,R版本3.1.0(2014-04-10),RStudion版本0.98.977)

编辑:

也可以在这里展示:

iris %>% mutate(test = 1 == 1 | row_number() < 10)
iris %>% mutate(test = 1 == 1 | row_number(Species) < 10)
iris %>% mutate(test = row_number() < 10 | 1 == 1)

编辑2:

令我困惑的是

iris %>% mutate(test = TRUE | row_number() < 10)  # works
iris %>% mutate(test = FALSE | row_number() < 10) # also works

但是

iris %>% mutate(test = 1 == 1 | row_number() < 10) # throws error
iris %>% mutate(test = 1 == 2 | row_number() < 10) # also throws error

1 个答案:

答案 0 :(得分:2)

issue已与this commit关闭。

current version available on CRAN at the time of this answer是版本0.3.0.2。此版本演示了您期望的行为。

temp <- iris %>%
  mutate(newcol = row_number() - Sepal.Length < 0 | 
           row_number() - Petal.Length < 0)
head(temp)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species newcol
# 1          5.1         3.5          1.4         0.2  setosa   TRUE
# 2          4.9         3.0          1.4         0.2  setosa   TRUE
# 3          4.7         3.2          1.3         0.2  setosa   TRUE
# 4          4.6         3.1          1.5         0.2  setosa   TRUE
# 5          5.0         3.6          1.4         0.2  setosa  FALSE
# 6          5.4         3.9          1.7         0.4  setosa  FALSE