【发布时间】:2020-10-17 13:49:54
【问题描述】:
这个问题是对this 回答的讨论的后续问题。
在dplyr 的group_by() 函数中使用c(... %*% ...) 和sum(... * ...) 有什么区别?
这两个代码给出相同的结果:
#1
library(dplyr) # 1.0.0
library(tidyr)
df1 %>%
group_by(Date, Market) %>%
group_by(Revenue = c(Quantity %*% Price),
TotalCost = c(Quantity %*% Cost),
Product, .add = TRUE) %>%
summarise(Sold = sum(Quantity)) %>%
pivot_wider(names_from = Product, values_from = Sold)
#2
library(dplyr) # 1.0.0
library(tidyr)
df1 %>%
group_by(Date, Market) %>%
group_by(Revenue = sum(Quantity * Price),
TotalCost = sum(Quantity * Cost),
Product, .add = TRUE) %>%
summarise(Sold = sum(Quantity)) %>%
pivot_wider(names_from = Product, values_from = Sold)
# A tibble: 2 x 7
# Groups: Date, Market, Revenue, TotalCost [2]
# Date Market Revenue TotalCost Apple Banana Orange
# <chr> <chr> <dbl> <dbl> <int> <int> <int>
#1 6/24/2020 A 135 37.5 35 20 20
#2 6/25/2020 A 25 15 10 15 NA
c(... %*% ...) 和 sum(... * ...) 之一更好/更快/首选/更整洁?
原始答案中的DATA:
df1 <- structure(list(Date = c("6/24/2020", "6/24/2020", "6/24/2020",
"6/24/2020", "6/25/2020", "6/25/2020"), Market = c("A", "A",
"A", "A", "A", "A"), Salesman = c("MF", "RP", "RP", "FR", "MF",
"MF"), Product = c("Apple", "Apple", "Banana", "Orange", "Apple",
"Banana"), Quantity = c(20L, 15L, 20L, 20L, 10L, 15L), Price = c(1L,
1L, 2L, 3L, 1L, 1L), Cost = c(0.5, 0.5, 0.5, 0.5, 0.6, 0.6)),
class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
【问题讨论】:
-
您可以在更大的数据集上使用
microbenchmark或system.time -
%*%是矩阵乘积。这有帮助吗? -
两个运营商的期望不同。
*进行元素乘法是正确的。或者%*%进行线性代数矩阵乘法,这是完全不同的。向量长度与后者之间不应该有区别,因为(1)它们应该是矩阵,并且(2)如果有任何期望你可能有回收,你不应该考虑 LA 矩阵乘法,因为它可以 仅当两个矩阵具有完全兼容的维度 (ncol(m1) == nrow(m2)) 时才会发生。 -
不同的说法......清楚你正在使用什么。如果
Quantity和Price都是向量,并且Quantity * Price对您来说有意义,那么使用*。对我来说,这才是最重要的。如果对您得到的结果有任何疑问,请将1:4 * 2:5(长度 4)与1:4 %*% 2:5(长度 1)进行比较。从逻辑上讲,您需要什么? -
谢谢@r2evans,这真的很清楚。
标签: r linear-algebra matrix-multiplication