按 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