在回答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
答案 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