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

