如何对名称相似的列求和?plyr是否有对应列处理函数?
对名称相似的列求和:plyr包实现方案
当然有办法实现你要的操作!虽然plyr没有直接提供按列名分组求和的专属函数,但我们可以结合它的工具函数,轻松完成重复列名的求和需求。
先明确你的输入数据和期望输出:
输入数据
# 构造你的输入数据框 df <- data.frame( C1 = c(2, 12), C1 = c(21, 12), T1 = c(12, 34), T1 = c(12, 45), row.names = c("n1", "n2") ) # 查看输入 df # C1 C1 T1 T1 # n1 2 21 12 12 # n2 12 12 34 45
期望输出
C1 T1 n1 23 24 n2 22 79
用plyr实现的方法
我们可以通过提取唯一列名 + 遍历分组求和的方式来完成:
library(plyr) # 第一步:获取所有唯一的列名 unique_col_names <- unique(colnames(df)) # 第二步:对每个唯一列名,筛选对应列并按行求和 summed_result <- ldply(unique_col_names, function(col) { # 筛选当前列名对应的所有列,然后按行求和 rowSums(df[, colnames(df) == col, drop = FALSE]) }) # 第三步:调整结果的列名和行名,匹配期望格式 colnames(summed_result) <- unique_col_names rownames(summed_result) <- rownames(df) # 查看最终结果 summed_result
运行这段代码后,就能得到你想要的按相似列名求和的结果啦。
额外补充:用dplyr简化操作(可选)
如果你不局限于plyr,用dplyr的长格式转换思路会更直观:
library(dplyr) library(tidyr) df %>% tibble::rownames_to_column("row_id") %>% # 把行名转成列,方便分组 pivot_longer(-row_id, names_to = "col_group") %>% # 转成长格式 group_by(row_id, col_group) %>% # 按行和列组分组 summarise(total = sum(value)) %>% # 求和 pivot_wider(names_from = col_group, values_from = total) %>% # 转回宽格式 tibble::column_to_rownames("row_id") # 恢复行名
这个方法代码更简洁,可读性也更强,适合处理更复杂的列分组场景。
内容的提问来源于stack exchange,提问作者user2300940
相关产品推荐
相关产品推荐

