在比较|
中的列时,为什么要使用any()
vs dplyr::mutate()
?
为什么他们会回答不同的答案?
例如:
library(tidyverse)
df <- data_frame(x = rep(c(T,F,T), 4), y = rep(c(T,F,T, F), 3), allF = F, allT = T)
df %>%
mutate(
withpipe = x | y # returns expected results by row
, usingany = any(c(x,y)) # returns TRUE for every row
)
这里发生了什么,为什么我应该使用一种方法来比较另一种值?
答案 0 :(得分:2)
两者之间的区别在于如何计算答案:
|
,元素按行进行比较,布尔逻辑用于返回正确的值。在上面的示例中,每个x和y对彼此进行比较,并为每对返回一个逻辑值,得到12个不同的答案,每个答案对应一行数据帧。any()
查看整个向量并返回单个值。在上面的示例中,计算新usingany
列的mutate行基本上是这样做的:any(c(df$x, df$y))
,它将返回TRUE
,因为其中至少有一个TRUE
值df$x
或df$y
。然后将该单个值分配给数据帧的每一行。您可以使用数据框中的其他列来查看此操作:
df %>%
mutate(
usingany = any(c(x,y)) # returns all TRUE
, allfany = any(allF) # returns all FALSE because every value in df$allF is FALSE
)
要在应该使用哪个时回答:如果要逐行比较元素,请使用|
。如果想要关于整个数据框的通用答案,请使用any()
。
TLDR,在使用dplyr::mutate()
时,您通常会想要使用|
。
答案 1 :(得分:1)
您也可以使用rowwise()
。
df <- data_frame(x = rep(c(T,F,T), 4), y = rep(c(T,F,T, F), 3), allF = F, allT = T)
df %>%
rowwise() %>%
mutate(x_or_y = any(x,y))
输出:
# A tibble: 12 x 5
x y allF allT x_or_y
<lgl> <lgl> <lgl> <lgl> <lgl>
1 TRUE TRUE FALSE TRUE TRUE
2 FALSE FALSE FALSE TRUE FALSE
3 TRUE TRUE FALSE TRUE TRUE
4 TRUE FALSE FALSE TRUE TRUE
5 FALSE TRUE FALSE TRUE TRUE
6 TRUE FALSE FALSE TRUE TRUE
7 TRUE TRUE FALSE TRUE TRUE
8 FALSE FALSE FALSE TRUE FALSE
9 TRUE TRUE FALSE TRUE TRUE
10 TRUE FALSE FALSE TRUE TRUE
11 FALSE TRUE FALSE TRUE TRUE
12 TRUE FALSE FALSE TRUE TRUE
答案 2 :(得分:-1)
您可以同时使用 OR 运算符 |
或 any()
比较 &
和 all()
是一回事。
按照建议,您必须考虑到 |
是矢量化的,而 any()
不是
为了以相同的方式使用 any(),您必须按行对数据进行分组,因此您可以调用等效的 any(current_row)
。这可以通过 purrr::pmap
或 dplyr::rowwise
完成:
请参阅下面的代码以比较所有方法:
df%>%mutate(row_OR=x|y,
row_pmap_any=pmap_lgl(select(.,c(x,y)), any))%>%
rowwise()%>%
mutate(row_rowwise_any=any(c_across(c(x,y))))
# A tibble: 12 x 7
# Rowwise:
x y allF allT row_OR row_pmap_any row_rowwise_any
<lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
1 TRUE TRUE FALSE TRUE TRUE TRUE TRUE
2 FALSE FALSE FALSE TRUE FALSE FALSE FALSE
3 TRUE TRUE FALSE TRUE TRUE TRUE TRUE
4 TRUE FALSE FALSE TRUE TRUE TRUE TRUE
5 FALSE TRUE FALSE TRUE TRUE TRUE TRUE
6 TRUE FALSE FALSE TRUE TRUE TRUE TRUE
7 TRUE TRUE FALSE TRUE TRUE TRUE TRUE
8 FALSE FALSE FALSE TRUE FALSE FALSE FALSE
9 TRUE TRUE FALSE TRUE TRUE TRUE TRUE
10 TRUE FALSE FALSE TRUE TRUE TRUE TRUE
11 FALSE TRUE FALSE TRUE TRUE TRUE TRUE
12 TRUE FALSE FALSE TRUE TRUE TRUE TRUE
所有方法都有效,我没有发现性能有太大差异。