Преобразуйте значение каждой строки в определенном столбце в процент от значения определенной строки в этом конкретном столбце. - PullRequest
0 голосов
/ 26 мая 2018

У меня есть фрейм данных, состоящий из данных из финансовых отчетов (например, отчета о прибылях и убытках, бухгалтерского баланса, отчета о движении денежных средств), где каждая строка ссылается на запись финансового отчета (например, выручка, прибыль) и каждый столбец ссылается на определенныйгод.

Примером данных могут быть следующие:

variable <- c("Revenue", "Cost of Goods Sold", "Gross Profit", "SG&A", "Operating Income", "Interest Expense", 
          "Pretax Income", "Income Tax", "Net Income")
year_2014 <- c(6500, 3012, 3488, 1231, 2257, 231, 2026, 462, 1564)
year_2015 <- c(3250, 1323, 1927, 912, 1015, 109, 906, 209, 697)
year_2016 <- c(4965, 2723, 2242, 1159, 1083, 106, 977, 187, 790)
df <- data.frame(variable, year_2014, year_2015, year_2016) 

Я хотел бы получить общий размер финансового отчета, где я делю каждую строку на сумму выручки.Например, в 2014 году чистый доход 1564 года / доход 6500 * 100. Налог на прибыль 462 / доход 6500 * 100 и т. Д.

Конечный результат, который я ищу, выглядит примерно так: Common Sized Income Statement

Я пытался решить проблему несколькими способами, но все это не сработало:

library(dplyr)

df <- df %>%
    mutate(percentage = year_2014/filter(select(year_2014), variable == "Revenue")

Указан источник что я не могу фильтровать в mutate.

Я попытался использовать нотацию поднабора, чтобы получить строку «Доход» для последующих шагов деления, но это не удалось:

df <- df %>%
    mutate(percentage = year_2014/variable["Revenue"])

Я также искал Stackoverflow, но не могу найти ответ.«Самый близкий» ответ, который я получил, был пост и пост .Однако эти записи различаются, поскольку их наборы данных представлены в длинном формате (в отличие от широкоформатного, такого как мой), их наборы данных состоят из групп (у меня нет ничего для «group_by»), и мне нужно жестко закодировать конкретную строку, которую я создаюссылка на.

Очень ценится!Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Можно попробовать dplyr::mutate_at.Более того, если Revenue не ожидается в качестве 1-й строки, то общее решение может быть следующим:

library(dplyr)

df %>% mutate_at(vars(starts_with("year")), 
                  funs(100*./.[which(variable == "Revenue")])) %>%
  as.data.frame()


#             variable year_2014 year_2015 year_2016
# 1            Revenue    100.00    100.00    100.00
# 2 Cost of Goods Sold     46.34     40.71     54.84
# 3       Gross Profit     53.66     59.29     45.16
# 4               SG&A     18.94     28.06     23.34
# 5   Operating Income     34.72     31.23     21.81
# 6   Interest Expense      3.55      3.35      2.13
# 7      Pretax Income     31.17     27.88     19.68
# 8         Income Tax      7.11      6.43      3.77
# 9         Net Income     24.06     21.45     15.91
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...