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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:10:01