如何在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_) )
代码说明
ifelse(sample_size >= 100, alt_freq, NA):将分组内样本量不足100的行的alt_freq转为NA;sd(..., na.rm = TRUE):计算标准差时自动忽略这些NA,只使用符合条件的alt_freq值;- 可选的
case_when:如果需要让小样本的行不显示标准差(仅保留NA),可以加上这一步,否则所有行都会显示该分组的标准差结果。
内容的提问来源于stack exchange,提问作者Ömer A.
相关产品推荐
相关产品推荐

