两个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
相关产品推荐
相关产品推荐

