с тидиверсом
library(tidyverse)
df %>%
group_by(company) %>%
summarise(Expenses1 = sum(sum*grepl('^20', account)),
Expenses2 = sum(sum*grepl('^28|^29', account)))
# # A tibble: 2 x 3
# company Expenses1 Expenses2
# <chr> <dbl> <dbl>
# 1 B01 -71556 - 6653
# 2 B13 64276 724713
С таблицей данных
library(data.table)
setDT(df)
df[, lapply(c(Expenses1 = '^20',
Expenses2 = '^28|^29'),
function(patt) sum(sum*grepl(patt, account)))
, by = company]
# company Expenses1 Expenses2
# 1: B01 -71556.23 -6652.7
# 2: B13 64276.22 724712.8
Если у вас действительно есть только две группы, вы можете создать другую переменную группировки, а затем использовать dcast
или spread
, например,
df[, .(Expenses = sum(sum))
, by = .(company,
acct_type = paste0('Expenses_', ifelse(grepl('^20', account), '20', 'other')))] %>%
dcast(company ~ acct_type)
# company Expenses_20 Expenses_other
# 1: B01 -71556.23 -6652.7
# 2: B13 64276.22 724712.8