R语言dplyr按组对向量值条件替换为NA的问题求解
问题原因
你出现错误的核心原因是误用了base::ifelse的向量化逻辑:sum(val[between(x, 2, 3)] > 4) >= 2是分组级别的单值判断(每个分组只会返回1个TRUE/FALSE),而base的ifelse在判定条件长度为1时,只会取no参数的第一个元素作为返回值填充整组,因此b组的val2被全部填充为val的第一个值1,导致结果错误。
正确实现代码
你可以直接使用R原生的分支语句if(){}/else{}替代ifelse,因为分组后每组的判断结果唯一,分支语句会直接返回整列的val:
library(dplyr) tibble( grp = c("a", "a", "a", "b", "b", "b"), x = c(1, 2, 3, 1, 2, 3), val = c(4, 5, 6, 1, 2, 1) ) %>% group_by(grp) %>% mutate(val2 = if(sum(val[between(x, 2, 3)] > 4) >= 2) NA else val)
运行结果
# A tibble: 6 × 4 # Groups: grp [2] grp x val val2 <chr> <dbl> <dbl> <dbl> 1 a 1 4 NA 2 a 2 5 NA 3 a 3 6 NA 4 b 1 1 1 5 b 2 2 2 6 b 3 1 1
内容的提问来源于stack exchange,提问作者Philippe Massicotte
相关产品推荐
相关产品推荐

