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

两个DataFrame相减并保留字符型名称列的一行代码实现问询

当然有更简洁的一行代码实现方式!下面给你几种不同风格的解决方案,都能在保留name列的同时完成相减操作,完全不需要拆分再合并数据框:

1. dplyr 风格(可读性拉满,推荐)

如果你习惯用tidyverse工具链,用mutate()配合across()可以轻松实现:

library(dplyr)
df3 <- df2 %>% mutate(across(-name, ~ .x - df1[[cur_column()]]))

这里across(-name)会选中所有除name外的列,~ .x - df1[[cur_column()]]表示用当前列(df2的列)减去df1中同名的列,直接生成包含name和计算结果的完整数据框。

2. Base R 极简一行(无需额外包)

如果不想加载任何包,用基础R的cbind()就能一步搞定:

df3 <- cbind(df1["name"], df2[-1] - df1[-1])

直接把df1的name列和两数据框非name列的差值结果合并,代码短且高效。

3. data.table 风格(适合大数据场景)

如果处理的是超大数据集,data.table的方法会更高效:

library(data.table)
df3 <- setDT(df2)[, (names(df2)[-1]) := .SD - df1[names(df2)[-1]], .SDcols = -"name"][]

通过引用修改列值,避免额外内存开销,适合大规模数据操作。

运行以上任意一种代码,你都会得到和原来完全一致的结果:

name month1 month2 month3
1 name1     17     21     27
2 name2     17     23     27
3 name3     17     23     28
4 name4     17     26     28

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:17:42