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

如何在tidyverse中按组对数据框行子集应用函数?

问题分析与解决方案

问题根源

你之前的代码逻辑有误:case_when仅控制哪些行显示标准差结果,但计算标准差时仍使用了整个分组的所有alt_freq值,完全没过滤掉sample_size < 100的行。比如:

  • 第一个代码中所有行显示相同的sdev,因为sd()计算的是全组所有数据的标准差;
  • 第二个代码里小样本行显示NA,但符合条件的行的sdev依然是全组数据的结果,不是仅基于样本量≥100的行计算的。

正确实现代码

要实现「每组仅用sample_size ≥ 100的行计算alt_freq的标准差」,需要在计算标准差时就过滤掉不符合条件的行,同时保留原数据的所有行和分组结构:

snps_df %>% 
  group_by(rsid) %>% 
  mutate(
    # 计算仅包含样本量≥100的行的标准差
    sdev = sd(ifelse(sample_size >= 100, alt_freq, NA), na.rm = TRUE),
    # 可选:让小样本的行显示NA,仅符合条件的行展示标准差
    sdev = case_when(sample_size >= 100 ~ sdev, TRUE ~ NA_real_)
  )

代码说明

  1. ifelse(sample_size >= 100, alt_freq, NA):将分组内样本量不足100的行的alt_freq转为NA;
  2. sd(..., na.rm = TRUE):计算标准差时自动忽略这些NA,只使用符合条件的alt_freq值;
  3. 可选的case_when:如果需要让小样本的行不显示标准差(仅保留NA),可以加上这一步,否则所有行都会显示该分组的标准差结果。

内容的提问来源于stack exchange,提问作者Ömer A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:50:54