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

如何用dplyr或其他方法实现同列名tibble按列对应相乘并保留指定日期?

用dplyr实现tibble对应列相乘的简便方法

这问题很常见,用dplyr就能轻松搞定,先给你构造示例数据(完全匹配你描述的结构),方便你直接测试:

library(tibble)
library(dplyr)

# 构造tb1(单行数据)
tb1 <- tibble(
  date = as.Date("2017-06-01"),
  a = 113.,
  b = 182.,
  c = 21.0,
  d = 31.9,
  e = 111.
)

# 构造tb2(三行数据)
tb2 <- tibble(
  date = as.Date(c("2016-05-01", "2016-06-01", "2016-07-01")),
  a = c(122., 117., 116.),
  b = c(106., 111., 94.4),
  c = c(23.9, 20.8, 22.5),
  d = c(43.7, 41.6, 41.0),
  e = c(93.5, 111., 92.4)
)

方法一:dplyr across() 极简写法

这是最直观的方式,利用across()批量处理除date外的所有列,结合cur_column()自动匹配tb1的对应列:

tb_result <- tb2 %>%
  mutate(across(-date, ~ .x * tb1[[cur_column()]]))

原理说明:

  • -date表示排除日期列,只处理数值列
  • cur_column()会自动获取当前正在处理的列名(比如a、b),然后从tb1中提取该列的唯一值(因为tb1只有一行)
  • R会自动把这个单值循环,和tb2对应列的每个元素做乘法,完美实现逐行对应相乘

方法二:提前提取tb1数值向量(更严谨)

如果担心列顺序不一致的问题,可以先把tb1的数值列提取成命名向量,再做乘法:

# 提取tb1的数值列,转成命名向量
tb1_numeric <- tb1 %>% select(-date) %>% unlist()

# 执行乘法
tb_result <- tb2 %>%
  mutate(across(-date, ~ .x * tb1_numeric[cur_column()]))

方法三:Base R 简洁写法

如果你不想用dplyr,也可以用Base R的方式实现:

# 分离tb2的日期列和数值列
tb2_date <- tb2["date"]
tb2_numeric <- tb2 %>% select(-date)

# 相乘后合并日期列
tb_result <- cbind(tb2_date, tb2_numeric * tb1_numeric)

验证结果

比如tb2第一行的a列:122 * 113 = 13786,你可以查看tb_result$a[1]确认结果是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:58