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
相关产品推荐
相关产品推荐

