gpt4 book ai didi

r - 将数据框乘以向量的最有效方法

转载 作者:行者123 更新时间:2023-12-04 09:39:30 25 4
gpt4 key购买 nike

将数据框的每一列乘以向量的最有效方法是什么?

例如数据框 (df) 具有以下列 (col1, col2, col3, col4) 和向量 (v) 具有以下元素 (v1,v2,v3).

我希望输出为:col2*v1, col3*v2, col4*v3

我一直在尝试 df[c(2:4)] * c(v1,v2,v3) 但似乎向量的元素并没有乘以每个向量的每一行专栏。

最佳答案

您可以尝试(使用 Richard Scriven 的回答中的 dfv):

df[-1] <- t(t(df[-1]) * v)
df
# a x y z
# 1 a 5 40 105
# 2 b 10 50 120
# 3 c 15 60 135

当您将矩阵与向量相乘时,它会按列相乘。由于您想将行乘以向量,我们使用 t 转置 df[-1],乘以 v,然后转置回使用t.

似乎这种方法在基准测试中比 Map 方法略有优势,并且比 sweep 有显着优势:

library(microbenchmark)
rscriven <- function(df, v) cbind(df[1], Map(`*`, df[-1], v))
josilber <- function(df, v) cbind(df[1], t(t(df[-1]) * v))
dardisco <- function(df, v) cbind(df[1], sweep(df[-1], MARGIN=2, STATS=v, FUN="*"))
df2 <- cbind(data.frame(rep("a", 1000)), matrix(rnorm(100000), nrow=1000))
v2 <- rnorm(100)
all.equal(rscriven(df2, v2), josilber(df2, v2))
# [1] TRUE
all.equal(rscriven(df2, v2), dardisco(df2, v2))
# [1] TRUE

microbenchmark(rscriven(df2, v2), josilber(df2, v2), dardisco(df2, v2))
# Unit: milliseconds
# expr min lq median uq max neval
# rscriven(df2, v2) 5.276458 5.378436 5.451041 5.587644 9.470207 100
# josilber(df2, v2) 2.545144 2.753363 3.099589 3.704077 8.955193 100
# dardisco(df2, v2) 11.647147 12.761184 14.196678 16.581004 132.428972 100

感谢@thelatemail 指出 Map 方法对于 100 倍大的数据帧来说要快得多:

df2 <- cbind(data.frame(rep("a", 10000)), matrix(rnorm(10000000), nrow=10000))
v2 <- rnorm(1000)
microbenchmark(rscriven(df2, v2), josilber(df2, v2), dardisco(df2, v2))
# Unit: milliseconds
# expr min lq median uq max neval
# rscriven(df2, v2) 75.74051 90.20161 97.08931 115.7789 259.0855 100
# josilber(df2, v2) 340.72774 388.17046 498.26836 514.5923 623.4020 100
# dardisco(df2, v2) 928.81128 1041.34497 1156.39293 1271.4758 1506.0348 100

看来您需要进行基准测试以确定哪种方法对您的应用来说最快。

关于r - 将数据框乘以向量的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com