Как получить произведение двух столбцов в R

#r

#r

Вопрос:

Итак, я пытаюсь получить произведение 2 столбцов во фрейме данных, и я продолжаю получать ошибки. Кто-нибудь может помочь?

Пожалуйста, смотрите ниже

 dput(PQ[1:10, "Prices", drop = FALSE])
structure(list(Prices = list(13.99, c(13.95, 14.95), c(13.99, 
10.99), c(10.99, 13.95, 13.99), c(14.95, 11.95, 13.99), c(11.95, 
13.95), c(11.95, 12.95), c(13.99, 14.95, 10.99, 11.95), 12.95, 
    c(10.99, 13.95))), row.names = c(NA, 10L), class = "data.frame")

dput(PQ[1:10, "Quantities", drop = FALSE])
structure(list(Quantities = list(2L, c(1L, 1L), c(3L, 3L), c(2L, 
2L, 3L), 1:3, 2:1, c(3L, 1L), c(3L, 1L, 2L, 2L), 1L, c(3L, 1L
))), row.names = c(NA, 10L), class = "data.frame")

  

Я пытался

 PQ <- RawOrders[,c("Prices", "Quantities")]

PQ <- PQ %>% mutate(Sub_Total = Prices * Quantities)
  

но я продолжал получать следующее сообщение об ошибке -> Ошибка в ценах * Количествах: нечисловой аргумент для двоичного оператора

Ответ №1:

Столбец — это list столбцы. Мы можем использовать map2 purrr цикл from to list и выполнить умножение

 library(dplyr)
library(purrr)
PQ %>%
     mutate(Sub_Total = map2(Prices, Quantities, ~ .x * .y))
  

-вывод

 # A tibble: 10 x 3
#   Prices    Quantities Sub_Total
#   <list>    <list>     <list>   
# 1 <dbl [1]> <int [1]>  <dbl [1]>
# 2 <dbl [2]> <int [2]>  <dbl [2]>
# 3 <dbl [2]> <int [2]>  <dbl [2]>
# 4 <dbl [3]> <int [3]>  <dbl [3]>
# 5 <dbl [3]> <int [3]>  <dbl [3]>
# 6 <dbl [2]> <int [2]>  <dbl [2]>
# 7 <dbl [2]> <int [2]>  <dbl [2]>
# 8 <dbl [4]> <int [4]>  <dbl [4]>
# 9 <dbl [1]> <int [1]>  <dbl [1]>
#10 <dbl [2]> <int [2]>  <dbl [2]>
  

Если мы хотим получить sum

 PQ %>%
     mutate(Sub_Total = map2_dbl(Prices, Quantities,
           ~ sum(.x * .y, na.rm = TRUE)))
  

-вывод

 # A tibble: 10 x 3
#   Prices    Quantities Sub_Total
#   <list>    <list>         <dbl>
# 1 <dbl [1]> <int [1]>       28.0
# 2 <dbl [2]> <int [2]>       28.9
# 3 <dbl [2]> <int [2]>       74.9
# 4 <dbl [3]> <int [3]>       91.8
# 5 <dbl [3]> <int [3]>       80.8
# 6 <dbl [2]> <int [2]>       37.8
# 7 <dbl [2]> <int [2]>       48.8
# 8 <dbl [4]> <int [4]>      103. 
# 9 <dbl [1]> <int [1]>       13.0
#10 <dbl [2]> <int [2]>       46.9
  

данные

 PQ <- structure(list(Prices = list(13.99, c(13.95, 14.95), c(13.99, 
10.99), c(10.99, 13.95, 13.99), c(14.95, 11.95, 13.99), c(11.95, 
13.95), c(11.95, 12.95), c(13.99, 14.95, 10.99, 11.95), 12.95, 
    c(10.99, 13.95)), Quantities = list(2L, c(1L, 1L), c(3L, 
3L), c(2L, 2L, 3L), 1:3, 2:1, c(3L, 1L), c(3L, 1L, 2L, 2L), 1L, 
    c(3L, 1L))), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))
  

Комментарии:

1. Привет, @akrun, я попытался запустить это, и оно выдало мне это сообщение об ошибке — Ошибка в .x * Количествах: нечисловой аргумент для двоичного оператора

2. @SusanMwansa Я предполагаю, что столбцы ‘PQ’ являются list столбцами. В dput , вы показали два разных набора данных.

3. @SusanMwansa Извините, a , отсутствовал. Можете ли вы попробовать сейчас

4. действительно, они есть. Это один фрейм данных с двумя столбцами. Я просто не знал, как вернуть dput с обоими из них, поэтому я дважды запустил его, показывая разные столбцы.

5. @SusanMwansa можете ли вы попробовать сейчас. Я забыл, что отсутствует , . теперь это должно сработать

Ответ №2:

В базе R вы можете использовать mapply :

 PQ$Sub_Total <- mapply(function(x, y) sum(x * y), PQ$Prices, PQ$Quantities)
PQ

# A tibble: 10 x 3
#   Prices    Quantities Sub_Total
#   <list>    <list>         <dbl>
# 1 <dbl [1]> <int [1]>       28.0
# 2 <dbl [2]> <int [2]>       28.9
# 3 <dbl [2]> <int [2]>       74.9
# 4 <dbl [3]> <int [3]>       91.8
# 5 <dbl [3]> <int [3]>       80.8
# 6 <dbl [2]> <int [2]>       37.8
# 7 <dbl [2]> <int [2]>       48.8
# 8 <dbl [4]> <int [4]>      103. 
# 9 <dbl [1]> <int [1]>       13.0
#10 <dbl [2]> <int [2]>       46.9
  

Ответ №3:

ВЫ МОЖЕТЕ ПОПРОБОВАТЬ ЭТО

PQ $new = отображение (цены, количества, ~ .x * .y))