如何为不同DataFrame中的匹配数据赋值并计算行总和
问题描述
现有两个R语言DataFrame:
df1 <- data.frame(v1 = c("l", "b", "c", "i", "e", "h", "g"), v2 = c("a", "c", "b", "f", "g", "n", "m"), v3 = c("m", "h", "f", "c", "d", "j", "k")) df2 <- data.frame(v1 = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"), v2 = c(1,6,5,4,2,9,7,3,2,1,4,5,6,9))
需求是将df1中每个字符匹配df2对应的数值,计算每行数值之和并生成Total列。之前用ifelse循环实现时需要为每个字符写单独语句,希望找到更高效的方法。期望结果如下:
v1 v2 v3 Total l a c 11 b c h 14 c b f 20 i f c 16 e g d 13 h n j 15 g m k 17
高效实现方法
方法一:Base R 原生实现
利用命名向量和match逻辑快速完成匹配与求和,无需逐字符写判断:
# 将df2转换为命名向量,字符作为名字,对应数值作为值 value_map <- setNames(df2$v2, df2$v1) # 把df1的所有字符列替换为对应数值 df1_num <- apply(df1, 2, function(col) value_map[col]) # 计算每行总和并添加为Total列 df1$Total <- rowSums(df1_num) # 查看最终结果 print(df1)
方法二:Tidyverse 语法实现
如果习惯用tidyverse的链式操作,可以通过转格式批量匹配:
library(tidyverse) df_result <- df1 %>% # 添加行号,用于后续恢复宽格式 mutate(row_id = row_number()) %>% # 转长格式,把所有字符列合并为一列统一匹配 pivot_longer(cols = -row_id, names_to = "col_name", values_to = "char") %>% # 左连接df2,匹配对应数值 left_join(df2, by = c("char" = "v1")) %>% # 转回宽格式,恢复原列结构 pivot_wider(id_cols = row_id, names_from = "col_name", values_from = "v2") %>% # 计算每行数值总和 mutate(Total = v1 + v2 + v3) %>% # 移除行号,调整列顺序至目标格式 select(v1, v2, v3, Total) # 查看结果 print(df_result)
内容的提问来源于stack exchange,提问作者CypEg
相关产品推荐
相关产品推荐

