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@Tjeboif_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