You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分组均值±标准差创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:44:58