#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))