R sumif на основе нескольких условий

#r

#r

Вопрос:

Я пытаюсь создать сводные таблицы на основе суммы или среднего значения значений других столбцов, а не по количеству.

 Amount  Age ActualResult    Prediction
100     20  Pass            Pass
200     24  Pass            Pass
300     30  Pass            Fail
400     34  Pass            Fail
500     40  Fail            Pass
600     44  Fail            Pass
700     50  Fail            Fail
800     54  Fail            Fail
  

Я могу получить таблицу по количеству, используя следующий код:

 table(data$ActualResult,data$Prediction)


            Predict Pass    Predict Fail
Actual Pass 2               2
Actual Fail 2               2
  

Но я не знаю, как получить таблицу по сумме суммы или среднего возраста:
По сумме:

             Predict Pass    Predict Fail
Actual Pass 300             700
Actual Fail 1100            1500
  

По среднему возрасту:

             Predict Pass    Predict Fail
Actual Pass 22              32
Actual Fail 42              52
  

Какой код я бы использовал для создания таблиц по количеству и среднему возрасту?

Ответ №1:

Это можно сделать с questionr помощью пакета

 questionr::wtd.table(
  data$ActualResult,
  data$Prediction,
  weights = data$Amount
)
#>      Fail Pass
#> Fail 1500 1100
#> Pass  700  300
  

Чтобы получить средний возраст, разделите на исходную таблицу

 questionr::wtd.table(
  data$ActualResult,
  data$Prediction,
  weights = data$Age
) / table(data$ActualResult,data$Prediction)
#>      Fail Pass
#> Fail   52   42
#> Pass   32   22
  

Ответ №2:

Вот tidyverse способ, используя ваши данные как df :

 library(tidyverse)

# sum of Amount
sum_amount <-
  df %>%
  group_by(ActualResult, Prediction) %>%
  summarize(sum = sum(Amount)) %>%
  pivot_wider(names_from = "Prediction", 
              values_from = "sum", 
              names_prefix = "Predict")

# average Age
avg_age <-
  df %>%
  group_by(ActualResult, Prediction) %>%
  summarize(avg = mean(Age)) %>%
  pivot_wider(names_from = "Prediction", 
              values_from = "avg", 
              names_prefix = "Predict")