如何用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
相关产品推荐
相关产品推荐

