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

如何在R中对同名列按行取最大值并合并

解决R中同名列按行取最大值合并的问题

错误原因

你把示例代码里的colSums换成max(x, na.rm=TRUE)后报错,是因为colSums会对转置后的每个列分组(对应原数据的同名列)的每一列求和(也就是原数据的每一行求和),返回的是和原数据行数相同的向量;而直接用max(x, na.rm=TRUE)会把整个分组的所有值取一个单一最大值,返回长度为1的向量,和其他分组的返回长度不匹配,因此触发arguments must have same length错误。

正确实现方法

以下是几种高效的解决方式,适配不同数据规模:

方法1:Base R原生实现(无需额外包)

通过split.default按列名分组,再对每组列按行取最大值:

# 模拟带同名列的数据集(替换成你的实际数据)
set.seed(123)
df <- data.frame(A=rpois(5,1), A=rpois(5,5), B=rpois(5,2), B=rpois(5,3), check.names=FALSE)

# 合并同名列,每行取最大值
merged_df <- as.data.frame(lapply(split.default(df, names(df)), function(x) {
  apply(x, 1, max, na.rm=TRUE)
}))

方法2:用matrixStats包提升大数据效率

如果你的数据集行数/列数极大,apply效率较低,推荐用matrixStats的rowMaxs函数,性能更优:

library(matrixStats)

# 合并同名列
merged_df <- as.data.frame(lapply(split.default(df, names(df)), rowMaxs, na.rm=TRUE))

方法3:用dplyr+tidyr的tidy语法(更直观)

适合习惯tidyverse风格的用户:

library(dplyr)
library(tidyr)

merged_df <- df %>%
  pivot_longer(everything(), names_to = "col_name", values_to = "value") %>%
  group_by(row_number(), col_name) %>%
  summarize(max_value = max(value, na.rm=TRUE), .groups = "drop") %>%
  pivot_wider(names_from = col_name, values_from = max_value) %>%
  select(-`row_number()`)

验证结果

以模拟数据为例,原df的每行A列分别是c(0,5)、c(1,3)等,合并后的merged_df$A会是5、3等对应行的最大值,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:01:12