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

R语言按组合并行值:仅处理单值列组,多值组保留原样

问题解答:按条件分组移动非NA值到首行

原始数据

原始的rawfile数据框结构如下:

structure(list(mz = c(123, 243, 277, 456, 886.555, 886.556, 887.565, 
887.567, 887.568), condition.1 = c(0.001, 0.003, 2e-04, NA, 0.000511135, 
NA, NA, 0.000162055, NA), condition.2 = c(NA, NA, 3e-04, 0.007, 
NA, 0.000661594, 1e-04, 3e-04, NA), condition.3 = c(NA, NA, 4e-04, 
NA, NA, 0.000502741, NA, NA, 2e-04), group = c(1, 2, 3, 4, 5, 
5, 6, 6, 6)), row.names = c(NA, -9L), class = "data.frame")

需求说明

当组内存在多行时,仅在组内所有condition列都仅有1个非NA值的情况下,将组内各condition列的非NA值移至组内首行;若组内任意一个condition列存在多个非NA值,则该组保持原始状态不变。

原代码局限

原代码会对所有多行组执行移动操作,未判断condition列的非NA值数量,导致像group 6这类存在多非NA值的组被错误修改,不符合需求。

修改后的解决方案

修改后的函数与调用代码

# 修改后的函数:仅满足条件时执行移动操作
move_values <- function(df) {
  # 仅处理多行组
  if (nrow(df) > 1) {
    # 获取所有condition列
    cond_cols <- grep("^condition", names(df), value = TRUE)
    # 检查每个condition列的非NA值数量是否都≤1
    all_single_val <- all(sapply(df[cond_cols], function(col) sum(!is.na(col)) <= 1))
    
    # 仅当所有condition列都只有单个非NA值时执行移动
    if (all_single_val) {
      for (col in cond_cols) {
        df[1, col] <- ifelse(any(!is.na(df[, col])), df[!is.na(df[, col]), col], NA)
        df[-1, col] <- NA
      }
    }
  }
  return(df)
}

# 分组应用函数
result <- rawfile %>%
  group_by(group) %>%
  do(move_values(.)) %>%
  ungroup()

预期结果

执行后得到的目标数据框结构如下:

structure(list(mz = c(123, 243, 277, 456, 886.555, 886.556, 887.565, 
887.567, 887.568), condition.1 = c(0.001, 0.003, 2e-04, NA, 0.000511135, 
NA, NA, 0.000162055, NA), condition.2 = c(NA, NA, 3e-04, 0.007, 
0.000661594, NA, 1e-04, 3e-04, NA), condition.3 = c(NA, NA, 4e-04, 
NA, 0.000502741, NA, NA, NA, 2e-04), group = c(1L, 2L, 3L, 4L, 
5L, 5L, 6L, 6L, 6L)), class = "data.frame", row.names = c(NA, 
-9L))

内容的提问来源于stack exchange,提问作者RainieJin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:23