Вероятно, намного менее лаконичен, чем ответ Ронака, но демонстрирует функциональность развертки.
Пример построения df:
df <- data.frame(cbind(Firm = c("A", "B", "C", "D"),
Assets_Jan_2018 = as.numeric(c(210234, 123144, 897897, 235467)),
Assets_Feb_2018 = as.numeric(c(235425, 127124, 789798, 897342)),
Returns_Jan_2018 = as.double(c(4.5, 5.3, 1.4, 9.7)),
Returns_Feb_2019 = as.double(c(6.7, 1.2, 6.2, 3.2))))
Убедитесь, что числовые типы данных:
df <- type.convert(df)
Рассчитать взвешенную доходность:
FirmWeightedReturns <- cbind(Firm = df$Firm,
sweep(df[sapply(df, is.numeric) & !(grepl("returns", tolower(colnames(df))))],
2,
as.numeric(sapply(df[sapply(df, is.numeric) & !(grepl("returns", tolower(colnames(df))))], sum)), '/')
* df[grepl("returns", tolower(colnames(df)))])
Суммируйте как df:
TotalReturns <- data.frame(lapply(FirmWeightedReturns[sapply(FirmWeightedReturns, is.numeric)], sum))
Вывод на консоль:
TotalReturns