在R中处理含NA与前置信息列的数据,计算每8列均值
解决方法:带NA值的分组列均值计算(保留前置信息列)
针对需求:保留数据框前6列信息列,对后续M1-M10列按每8列一组计算行均值并忽略NA值,以下是具体实现方案:
步骤说明
- 拆分数据框:分离前6列信息列与后续数值列
- 分组数值列:按每8列一组划分,剩余不足8列的单独成组
- 计算均值:忽略NA值计算每组的行均值
- 合并结果:将信息列与均值列整合为最终数据框
代码实现
# 修正并构造完整数据框 df <- data.frame( I = rep(NA, 10), # 原数据中I列取值缺失,用NA占位 J = rep(NA, 10), # 原数据中J列取值缺失,用NA占位 DOB = c("25/11/2020", "29/4/2021", "29/1/2021", "24/10/2020", "24/10/2020", "10/2/2021", "16/10/2020", "16/10/2020", "28/3/2021", "8/6/2020"), DOG = c("3/5/2021", "28/11/2021", "27/8/2021", "17/5/2021", "19/6/2021", "25/9/2021", "5/5/2021", "12/3/2021", "22/9/2021", "8/12/2020"), REL = c(159L, 213L, 210L, 205L, 238L, 227L, 201L, 147L, 178L, 183L), GRP = c("tyn", "tyn", "tyn", "ged", "ged", "ged", "buun", "buun", "bunn", "buun"), DOS = c(NA, NA, NA, NA, NA, NA, "30.5.2021", NA, NA, "25.3.2021"), M1 = c(42L, 0L, 38L, 0L, 0L, 46L, 34L, 44L, 39L, 35L), M2 = c(0L, 45L, 42L, 34L, 39L, 0L, 50L, 42L, 0L, NA), M3 = c(34L, 50L, 53L, 0L, 45L, 42L, 53L, 0L, 45L, NA), M4 = c(42L, 0L, 34L, 34L, 50L, 53L, 0L, 34L, 50L, NA), M5 = c(0L, 45L, 50L, 42L, 0L, 34L, 34L, 42L, 0L, NA), M6 = c(38L, 42L, 53L, 0L, 45L, 50L, NA, 0L, 45L, NA), M7 = c(0L, 34L, 0L, 34L, 50L, 53L, NA, 34L, 50L, NA), M8 = c(0L, 39L, 0L, 42L, 0L, 34L, NA, 34L, 42L, NA), M9 = c(NA, 0L, 0L, 0L, 45L, 50L, NA, 50L, 0L, NA), M10 = c(NA, 27L, 0L, NA, 0L, 0L, NA, 53L, 34L, NA), row.names = c(NA, -10L) ) # 1. 分离信息列与数值列 info_cols <- df[, 1:6] value_cols <- df[, 7:ncol(df)] # 2. 按每8列分组数值列 group_size <- 8 group_ids <- ceiling(seq_along(colnames(value_cols)) / group_size) col_groups <- split(colnames(value_cols), group_ids) # 3. 计算每组行均值(忽略NA) mean_results <- lapply(col_groups, function(group) { rowMeans(value_cols[, group], na.rm = TRUE) }) # 4. 转换为数据框并命名均值列 mean_df <- as.data.frame(mean_results) colnames(mean_df) <- paste0("Mean_Group_", names(col_groups)) # 5. 合并信息列与均值结果 final_df <- cbind(info_cols, mean_df) # 查看最终结果 print(final_df)
关键细节解释
- NA处理:
rowMeans(na.rm = TRUE)会自动忽略NA值,仅计算非NA值的均值;若某行该组全为NA,结果会返回NaN,可通过replace(final_df, is.nan(final_df), NA)替换为NA。 - 分组逻辑:
ceiling(seq_along(...)/group_size)自动生成分组标识,适配任意数量的数值列,无需手动指定分组范围。 - 信息列保留:通过索引拆分确保前置信息列完全不参与计算,保留原始数据的完整性。
内容的提问来源于stack exchange,提问作者SolveData
相关产品推荐
相关产品推荐

