按 R 中的订单 ID 计算数据框中列表的总和
Sum Product of a list in dataframe by Order id in R
我正在做一个类似于 Uber Eat 的项目。我想在数据框中创建新列来计算这些订单的小计,但因为每列的 class 是“列表”,R 不允许我这样做。你知道有什么方法吗。
谢谢
a = c(1,2,3)
b = 1:2
c = (3,1)
P1 = c(12,13,4)
P2 = c(2,4)
P3 = c(12,1)
#My given dataframe will be:
Order | Price | Sub-total
a | P1 | sum(a*P1)
b | P2 | sum(b*P2)
c | P3 | sum(c*P3)
预期输出:
小计 = [50, 10, 37]
请查看附图以了解我的数据框
My dataframe
我的目标是如何计算 aP1、bP2、cP3 以及 aP1... 的总和。
首先,将您各自的订单和价格数据存储到列表中
a = c(1,2,3)
b = 1:2
c = c(3,1)
P1 = c(12,13,4)
P2 = c(2,4)
P3 = c(12,1)
Order <- list(a, b, c)
Price <- list(P1, P2, P3)
使用 tibble 以便您可以轻松设置列表列。
然后使用 tidyverse 结构,map
在两个列表列上应用您的公式。
library(dplyr)
library(purrr)
df <- tibble(Order = Order, Price = Price)
df <- df %>%
mutate(Sub_total = map2_dbl(Order, Price, ~ sum( .x * .y)))
结果如你所料。您可以看到存储为列表的原始数据,然后是小计。
> df
# A tibble: 3 x 3
Order Price Sub_total
<list> <list> <dbl>
1 <dbl [3]> <dbl [3]> 50
2 <int [2]> <dbl [2]> 10
3 <dbl [2]> <dbl [2]> 37
总和为 sum(df$Sub_total)
,即 97。
library(tidyverse)
orders <- list(
a = c(1,2,3),
b = 1:2,
c = c(3,1)
)
prices <- list(
P1 = c(12,13,4),
P2 = c(2,4),
P3 = c(12,1)
)
tibble(
Order = orders,
Price = prices
) %>%
mutate(
sub_total = Order %>% map2_dbl(Price, ~ sum(.x * .y))
)
#> # A tibble: 3 x 3
#> Order Price sub_total
#> <named list> <named list> <dbl>
#> 1 <dbl [3]> <dbl [3]> 50
#> 2 <int [2]> <dbl [2]> 10
#> 3 <dbl [2]> <dbl [2]> 37
由 reprex package (v2.0.1)
于 2021 年 10 月 1 日创建
这是base R
中的一个选项
d1 <- data.frame(Order = I(list(a, b, c)), Price = I(list(P1, P2, P3)))
d1$Sub_total <- unlist(Map(`%*%`, d1$Order, d1$Price))
-输出
> d1
Order Price Sub_total
1 1, 2, 3 12, 13, 4 50
2 1, 2 2, 4 10
3 3, 1 12, 1 37
我正在做一个类似于 Uber Eat 的项目。我想在数据框中创建新列来计算这些订单的小计,但因为每列的 class 是“列表”,R 不允许我这样做。你知道有什么方法吗。
谢谢
a = c(1,2,3)
b = 1:2
c = (3,1)
P1 = c(12,13,4)
P2 = c(2,4)
P3 = c(12,1)
#My given dataframe will be:
Order | Price | Sub-total
a | P1 | sum(a*P1)
b | P2 | sum(b*P2)
c | P3 | sum(c*P3)
预期输出: 小计 = [50, 10, 37]
请查看附图以了解我的数据框 My dataframe
我的目标是如何计算 aP1、bP2、cP3 以及 aP1... 的总和。
首先,将您各自的订单和价格数据存储到列表中
a = c(1,2,3)
b = 1:2
c = c(3,1)
P1 = c(12,13,4)
P2 = c(2,4)
P3 = c(12,1)
Order <- list(a, b, c)
Price <- list(P1, P2, P3)
使用 tibble 以便您可以轻松设置列表列。
然后使用 tidyverse 结构,map
在两个列表列上应用您的公式。
library(dplyr)
library(purrr)
df <- tibble(Order = Order, Price = Price)
df <- df %>%
mutate(Sub_total = map2_dbl(Order, Price, ~ sum( .x * .y)))
结果如你所料。您可以看到存储为列表的原始数据,然后是小计。
> df
# A tibble: 3 x 3
Order Price Sub_total
<list> <list> <dbl>
1 <dbl [3]> <dbl [3]> 50
2 <int [2]> <dbl [2]> 10
3 <dbl [2]> <dbl [2]> 37
总和为 sum(df$Sub_total)
,即 97。
library(tidyverse)
orders <- list(
a = c(1,2,3),
b = 1:2,
c = c(3,1)
)
prices <- list(
P1 = c(12,13,4),
P2 = c(2,4),
P3 = c(12,1)
)
tibble(
Order = orders,
Price = prices
) %>%
mutate(
sub_total = Order %>% map2_dbl(Price, ~ sum(.x * .y))
)
#> # A tibble: 3 x 3
#> Order Price sub_total
#> <named list> <named list> <dbl>
#> 1 <dbl [3]> <dbl [3]> 50
#> 2 <int [2]> <dbl [2]> 10
#> 3 <dbl [2]> <dbl [2]> 37
由 reprex package (v2.0.1)
于 2021 年 10 月 1 日创建这是base R
d1 <- data.frame(Order = I(list(a, b, c)), Price = I(list(P1, P2, P3)))
d1$Sub_total <- unlist(Map(`%*%`, d1$Order, d1$Price))
-输出
> d1
Order Price Sub_total
1 1, 2, 3 12, 13, 4 50
2 1, 2 2, 4 10
3 3, 1 12, 1 37