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

如何在Base R中用向量化方法为数据框各列乘不同值

Base R实现数据框列与向量对应元素相乘的向量化方案

问题背景

现有如下数据框:

x y z
1 0 0 0
2 1 0 0
3 0 1 0
4 1 1 0
5 0 0 1
6 1 0 1
7 0 1 1
8 1 1 1

待乘向量为 c(4, 2, 1),需要为数据框每列分别乘以向量中对应位置的值,得到目标结果:

x y z
1 0 0 0
2 4 0 0
3 0 2 0
4 4 2 0
5 0 0 1
6 4 0 1
7 0 2 1
8 4 2 1

现有循环实现代码:

pw2 <- c(4, 2, 1)
s01  <- seq_len(2) - 1
df  <- expand.grid(x=s01, y=s01, z=s01)
df

for (d in seq_len(3)) df[,d] <- df[,d] * pw2[d]
df

要求使用Base R的向量化方案实现,避免for循环。


向量化解决方案

方案1:矩阵广播运算

利用R中矩阵与向量的广播特性,将数据框转换为矩阵后直接与向量相乘,再转回数据框:

pw2 <- c(4, 2, 1)
s01 <- seq_len(2) - 1
df <- expand.grid(x=s01, y=s01, z=s01)

# 向量化运算
df_result <- as.data.frame(as.matrix(df) * pw2)
print(df_result)

原理:当矩阵(列数与向量长度一致)与向量相乘时,R会自动将向量广播到矩阵的每一行,实现每列对应乘以向量元素的效果,这是最简洁高效的方法之一。

方案2:使用mapply函数

mapply可对多个输入的对应元素批量执行函数操作,这里用它配对数据框的列和向量元素进行乘法:

pw2 <- c(4, 2, 1)
s01 <- seq_len(2) - 1
df <- expand.grid(x=s01, y=s01, z=s01)

# 向量化运算
df_result <- as.data.frame(mapply(`*`, df, pw2))
print(df_result)

原理:mapply会遍历df的每一列和pw2的每个元素,对每一组配对执行乘法函数,最终将结果组合为数据框。

方案3:利用scale函数(缩放场景适配)

scale函数通常用于数据标准化,通过参数设置可实现列的缩放(乘以目标常数):

pw2 <- c(4, 2, 1)
s01 <- seq_len(2) - 1
df <- expand.grid(x=s01, y=s01, z=s01)

# 向量化运算
df_result <- as.data.frame(scale(df, center=FALSE, scale=1/pw2))
print(df_result)

原理:scale=1/pw2表示将每列元素除以1/pw2,等价于乘以pw2。此方法更适合标准化类的缩放场景,前两种方案更直观通用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:37:38