Могу ли я иметь несколько переменных ответа в структуре FORMULA? - PullRequest
1 голос
/ 12 апреля 2019

Я хотел бы скопировать этот код, за исключением использования формулы вместо x и by

assets <- data.frame(asset.class = c("equity", "equity","equity",
                                     "option","option","option",
                                     "bond", "bond"),
                     rating = c("AAA", "A", "A", "AAA", 
                                "BB", "BB", "AAA", "A"),
                     counterparty.a = c(runif(3), rnorm(5)),
                     counterparty.b = c(runif(3), rnorm(5)),
                     counterparty.c = c(runif(3), rnorm(5)))

aggregate(x = assets[c("counterparty.a", "counterparty.b", "counterparty.c")],
                       by = assets[c("asset.class", "rating")],
                       FUN = sum)

Я пробовал это aggregate(counterparty.a + counterparty.b + counterparty.c ~ asset.class, assets + rating, sum), но это не сработало.Как добавить несколько переменных ответа?

1 Ответ

1 голос
/ 12 апреля 2019

Мы можем использовать cbind

out1 <- aggregate(cbind(counterparty.a, counterparty.b,  counterparty.c) ~ 
             asset.class + rating, assets, sum)

Или укажите ., чтобы включить все остальные столбцы

out2 <- aggregate(.~ asset.class + rating, assets, sum)
identical(out1, out2)
#[1] TRUE

Это можно сделать проще с tidyverse

library(dplyr)
assets %>%
      group_by_at(1:2) %>%
      summarise_all(sum)

Когда мы делаем + для lhs из ~, он выполняет агрегацию в один столбец, сворачивая строки как по горизонтали, так и по вертикали в группе, аналогичной приведенной ниже

assets %>% 
     group_by(asset.class, rating) %>%
     summarise_all(sum) %>% 
     ungroup %>% 
     mutate(rsum = rowSums(.[3:5])) %>%
     select(asset.class, rating, rsum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...