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

如何为不同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:12:19