如何基于另一数据框的聚合数据为R数据框添加列?
R语言:为数据框匹配对应列的求和结果
数据定义
df1 <- data.frame(ID = c("A01", "B01", "C03"), meta = LETTERS[1:3]) df2 <- data.frame(C03 = c(15,25,35), A01 = c(10,20,30), B01 = c(20,20,30))
需求
为df1中的每个ID,附加df2中对应列的colSums计算结果。
现有基础实现
vec1 <- as.data.frame(colSums(df2)) vec1$ID <- row.names(vec1) df.m <- merge(df1, vec1, by = "ID") df.m # 期望输出
期望输出
ID meta colSums(df2) 1 A01 A 60 2 B01 B 70 3 C03 C 75
更优实现方式
1. Base R 极简写法
无需创建中间数据框,直接通过match匹配ID与列名,一步添加结果列:
df1$colSums <- colSums(df2)[match(df1$ID, colnames(df2))]
执行后df1就会包含所需的求和列,结果与期望一致。
2. tidyverse 风格写法
如果常用dplyr等tidyverse工具,代码会更直观:
library(dplyr) df1 <- df1 %>% mutate(colSums = colSums(df2)[ID])
利用mutate直接根据ID匹配df2的列求和结果,逻辑清晰。
3. 结构化转换后连接
如果需要更清晰的中间步骤,可先将列和转换为带ID的数据框,再做左连接:
library(tibble) library(dplyr) # 先把df2的列和转成带ID的表格 col_sums_tbl <- colSums(df2) %>% enframe(name = "ID", value = "colSums") # 左连接到df1 df1 <- df1 %>% left_join(col_sums_tbl, by = "ID")
这种方式在复杂数据场景下更易扩展和维护。
内容的提问来源于stack exchange,提问作者nouse
相关产品推荐
相关产品推荐

