基于分组均值±标准差创建R语言逻辑列的问题求助
解决方法
你的代码存在几个关键问题:
- 未按
v3分组,导致计算的是全局均值和标准差,而非每个分组内的统计量 - 条件逻辑写反:你判断的是值超出均值±标准差范围,而需求是判断值处于该范围内
if_all参数使用错误,不需要额外传入TRUE, FALSE参数
正确的实现步骤是先按v3分组,再对v1和v2分别验证是否处于分组内的均值±标准差区间,最后用if_all确保两个条件同时满足:
library(tidyverse) df <- tibble( v1 = c(5, 7, 4, 2, 2, 3, 3, 4, 5, 6, 1, 7), v2 = c(1, 1, 1, 5, 7, 30, 1, 4, 5, 6, 6, 7), v3 = factor(c("a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b")) ) df %>% group_by(v3) %>% mutate(test = if_all(v1:v2, ~ . >= mean(.) - sd(.) & . <= mean(.) + sd(.))) %>% ungroup()
运行后得到的结果与你预期完全一致:
# A tibble: 12 × 4 v1 v2 v3 test <dbl> <dbl> <fct> <lgl> 1 5 1 a TRUE 2 7 1 a FALSE 3 4 1 a TRUE 4 2 5 a TRUE 5 2 7 a TRUE 6 3 30 a FALSE 7 3 1 b FALSE 8 4 4 b TRUE 9 5 5 b TRUE 10 6 6 b TRUE 11 1 6 b TRUE 12 7 7 b FALSE
关键细节说明
group_by(v3):锁定分组维度,让后续的mean()和sd()仅在当前分组内计算if_all(v1:v2, ~...):确保v1和v2同时满足条件,对应需求中的“且”逻辑- 核心条件
~ . >= mean(.) - sd(.) & . <= mean(.) + sd(.):验证当前值是否落在分组的均值±标准差区间内
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

