dplyr::if_else是否同时计算TRUE和FALSE?

dplyr::if_else是否同时计算TRUE和FALSE?,r,dplyr,R,Dplyr,考虑以下示例: 库(dplyr) #样本数据 种子(1) mydf%group_by(group)%%>%变异(最大值=ifelse(所有(!值)、最大值(索引)、索引[min(哪个(值))) #>#tibble:15 x 4 #>#组:组[3] #>值组索引最大值 #> #>1假a 12 #>2真a 2 #>3假a 3 2 #>4假a 4 2 #>5真a 5 2 #>6假b 1 4 #>7假b 2 4 #>8假b 3 4 #>9正确的b 4 #>10真b 5 4 #>1

考虑以下示例:

库(dplyr)
#样本数据
种子(1)
mydf%group_by(group)%%>%变异(最大值=ifelse(所有(!值)、最大值(索引)、索引[min(哪个(值)))
#>#tibble:15 x 4
#>#组:组[3]
#>值组索引最大值
#>            
#>1假a 12
#>2真a 2
#>3假a 3 2
#>4假a 4 2
#>5真a 5 2
#>6假b 1 4
#>7假b 2 4
#>8假b 3 4
#>9正确的b 4
#>10真b 5 4
#>11假C1 5
#>12假C2 5
#>13假C3 5
#>14假c 4 5
#>15假c 5
#这同样会对dplyr::if_else发出警告
mydf%>%group\U by(group)%>%mutate(最大值=如果其他(所有(!值)、最大值(索引)、索引[min(哪个(值))))
#>min中的警告(which(value)):min没有未丢失的参数;返回Inf
#>#tibble:15 x 4
#>#组:组[3]
#>值组索引最大值
#>            
#>1假a 12
#>2真a 2
#>3假a 3 2
#>4假a 4 2
#>5真a 5 2
#>6假b 1 4
#>7假b 2 4
#>8假b 3 4
#>9正确的b 4
#>10真b 5 4
#>11假C1 5
#>12假C2 5
#>13假C3 5
#>14假c 4 5
#>15假c 5
如代码中所述-
dplyr::if_else
确实会导致警告

min中的警告(which(value)):min没有未丢失的参数;返回Inf

删除“全部错误”组c-不再发出警告:

mydf_allTRUE <- mydf
mydf_allTRUE[14, 'value'] <- TRUE

mydf_allTRUE %>% group_by(group) %>% mutate(max_value = if_else(all(!value), max(index), index[min(which(value))]))
#> # A tibble: 15 x 4
#> # Groups:   group [3]
#>    value group index max_value
#>    <lgl> <fct> <int>     <int>
#>  1 FALSE a         1         2
#>  2 TRUE  a         2         2
#>  3 FALSE a         3         2
#>  4 FALSE a         4         2
#>  5 TRUE  a         5         2
#>  6 FALSE b         1         4
#>  7 FALSE b         2         4
#>  8 FALSE b         3         4
#>  9 TRUE  b         4         4
#> 10 TRUE  b         5         4
#> 11 FALSE c         1         4
#> 12 FALSE c         2         4
#> 13 FALSE c         3         4
#> 14 TRUE  c         4         4
#> 15 FALSE c         5         4
mydf_allTRUE%变异(max_value=if_else(all(!value)、max(index)、index[min(which(value)))
#>#tibble:15 x 4
#>#组:组[3]
#>值组索引最大值
#>           
#>1假a 12
#>2真a 2
#>3假a 3 2
#>4假a 4 2
#>5真a 5 2
#>6假b 1 4
#>7假b 2 4
#>8假b 3 4
#>9正确的b 4
#>10真b 5 4
#>11假c 1 4
#>12假C2 4
#>13假c 3 4
#>14真c 4
#>15假c 5 4
由(v0.3.0)于2019年12月22日创建

让我困惑的是,(我相信)我构造
TRUE
部分的方式是
FALSE
部分(
index[min(which(value))]
必须包含一个值。那么,为什么这会给我们一个警告呢? 这是有问题的,因为我有几千个组的数据,其中大多数都是“FALSE”位,警告使计算速度非常慢


我很乐意使用
base::ifelse
,但我只是想知道
dplyr::if_else
是如何同时评估正确和错误的方面的,这是不是同时存在

问题是因为我们正在检查一些情况,其中一些组返回的
NULL带有
which(value)`

警告消息:最小值(NULL):最小值没有未丢失的参数; 返回Inf


一个选项是通过使用
[1]
索引,使输出的
返回
NA

mydf %>%
   group_by(group) %>%
   mutate(max_value = if_else(all(!value), max(index), index[which(value)[1]]))
# A tibble: 15 x 4
# Groups:   group [3]
#   value group index max_value
#   <lgl> <fct> <int>     <int>
# 1 FALSE a         1         2
# 2 TRUE  a         2         2
# 3 FALSE a         3         2
# 4 FALSE a         4         2
# 5 TRUE  a         5         2
# 6 FALSE b         1         4
# 7 FALSE b         2         4
# 8 FALSE b         3         4
# 9 TRUE  b         4         4
#10 TRUE  b         5         4
#11 FALSE c         1         5
#12 FALSE c         2         5
#13 FALSE c         3         5
#14 FALSE c         4         5
#15 FALSE c         5         5

那么,你是说,
dplyr::if_else
似乎确实可以同时测试真与假?谢谢你的索引思想,这非常有用clever@Tjebo
if_else
附带额外的检查,如您的案例中的类型等,没有必要使用
ifelse/if_else
,因为它返回的是一个单一的输出。这确实是非常正确的。事实上,这对我很有启发性,因为到目前为止,我还没有完全理解ifelse/if_else和if/else之间的本质区别。这很有道理。谢谢
mydf %>%
   group_by(group) %>%
   mutate(max_value = if_else(all(!value), max(index), index[which(value)[1]]))
# A tibble: 15 x 4
# Groups:   group [3]
#   value group index max_value
#   <lgl> <fct> <int>     <int>
# 1 FALSE a         1         2
# 2 TRUE  a         2         2
# 3 FALSE a         3         2
# 4 FALSE a         4         2
# 5 TRUE  a         5         2
# 6 FALSE b         1         4
# 7 FALSE b         2         4
# 8 FALSE b         3         4
# 9 TRUE  b         4         4
#10 TRUE  b         5         4
#11 FALSE c         1         5
#12 FALSE c         2         5
#13 FALSE c         3         5
#14 FALSE c         4         5
#15 FALSE c         5         5
mydf %>%
    group_by(group) %>%
    mutate(max_value = if(all(!value)) max(index) else index[which(value)[1]])
# A tibble: 15 x 4
# Groups:   group [3]
#   value group index max_value
#   <lgl> <fct> <int>     <int>
# 1 FALSE a         1         2
# 2 TRUE  a         2         2
# 3 FALSE a         3         2
# 4 FALSE a         4         2
# 5 TRUE  a         5         2
# 6 FALSE b         1         4
# 7 FALSE b         2         4
# 8 FALSE b         3         4
# 9 TRUE  b         4         4
#10 TRUE  b         5         4
#11 FALSE c         1         5
#12 FALSE c         2         5
#13 FALSE c         3         5
#14 FALSE c         4         5
#15 FALSE c         5         5