R语言无需合并多数据框按行计算指定列对应均值
实现方法
从你给出的样例数据看,三个数据框行数一致、行顺序完全对应(ID列和N_D_SOS列取值完全匹配),不需要做任何表合并操作,直接对同名列逐位置计算平均值即可。
无依赖基础R写法
直接对三个表的对应列做算术平均,逻辑直白运行效率也最高:
# 指定需要计算均值的列 calc_cols <- c("N_EVI_SOS", "N_NDVI_SOS", "N_NIRv_SOS", "N_kNDVI_SOS") # 逐列计算三表对应行的均值,保留ID方便匹配结果 res <- data.frame(ID = nSOS_VI_GPR_05$ID) for (col in calc_cols) { res[[paste0("mean_", col)]] <- ( nSOS_VI_GPR_05[[col]] + nSOS_VI_GPR_10[[col]] + nSOS_VI_GPR_15[[col]] ) / 3 }
你举的N_EVI_SOS第一行样例计算结果为(134+139+144)/3=139,和预期完全一致。
通用扩展写法
如果后续要增加更多同结构的数据表,不用重复写加法逻辑,可以把所有表放进列表统一计算:
# 将所有待计算的数据框存入列表 df_list <- list(nSOS_VI_GPR_05, nSOS_VI_GPR_10, nSOS_VI_GPR_15) calc_cols <- c("N_EVI_SOS", "N_NDVI_SOS", "N_NIRv_SOS", "N_kNDVI_SOS") res <- data.frame(ID = nSOS_VI_GPR_05$ID) for (col in calc_cols) { # 提取所有表的当前列,按行求平均 res[[paste0("mean_", col)]] <- rowMeans( sapply(df_list, function(df) df[[col]]) ) }
可选校验:如果担心三个表的行顺序不匹配,不需要合并全表,只用ID列做行对齐即可:
nSOS_VI_GPR_10 <- nSOS_VI_GPR_10[match(nSOS_VI_GPR_05$ID, nSOS_VI_GPR_10$ID), ] nSOS_VI_GPR_15 <- nSOS_VI_GPR_15[match(nSOS_VI_GPR_05$ID, nSOS_VI_GPR_15$ID), ]
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

