在R中如何基于另一数据框的分类值对大数据框执行乘法运算?
R语言实现匹配分类字段并计算新列的方法
首先给出可直接运行的示例数据构造代码,方便测试验证:
# 构造小数据框 df_small <- data.frame( travel = c("bike", "car", "walk"), time = c(2.5, 1.0, 5.0) ) # 构造大数据框 df_large <- data.frame( year = c(2010, 2010, 2010, 2011, 2011, 2010), travel = c("bike", "car", "walk", "car", "walk", "bike"), rate = c(25, 70, 9.2, 71, 8.2, 23.1) )
实现方法
方法1:tidyverse(dplyr)实现(推荐,代码可读性高)
适合日常数据处理场景,逻辑清晰易维护:
library(dplyr) df_result <- df_large %>% # 按travel字段左连接匹配小数据框的time值 left_join(df_small, by = "travel") %>% # 计算距离列,不需要保留time列可再加 %>% select(-time) mutate(distance = rate * time)
方法2:基础R实现(无需安装第三方包)
两种可选写法:
- 写法1:merge合并后计算
# 按travel字段合并,all.x=TRUE保证大数据框所有行都被保留 df_merge <- merge(df_large, df_small, by = "travel", all.x = TRUE) # 新增distance列 df_merge$distance <- df_merge$rate * df_merge$time
- 写法2:命名向量快速匹配(更适合小映射表场景,运行速度更快)
# 把小数据框转成"出行类型-时间"的命名映射向量 time_map <- setNames(df_small$time, df_small$travel) # 直接匹配计算,无需合并数据框 df_large$distance <- df_large$rate * time_map[df_large$travel]
结果示例
最终输出的distance列计算结果如下:
| year | travel | rate | distance |
|---|---|---|---|
| 2010 | bike | 25.0 | 62.5 |
| 2010 | car | 70.0 | 70.0 |
| 2010 | walk | 9.2 | 46.0 |
| 2011 | car | 71.0 | 71.0 |
| 2011 | walk | 8.2 | 41.0 |
| 2010 | bike | 23.1 | 57.75 |
内容的提问来源于stack exchange,提问作者SCE
相关产品推荐
相关产品推荐

