【问题标题】:Convert the value of each row in a particular column into a percentage of the value of a particular row in that particular column将特定列中每一行的值转换为该特定列中特定行值的百分比
【发布时间】:2018-05-26 10:03:18
【问题描述】:

我有一个数据框,其中包含来自财务报表(例如损益表、资产负债表、现金流量表)的数据,每一行指的是财务报表条目(例如收入、利润),每列指的是特定的年。

数据示例如下:

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等等。

我正在寻找的最终结果如下所示:

我尝试了多种方法来解决问题,但都没有奏效:

library(dplyr)

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

这个source 表示我无法在 mutate 中过滤。

我尝试使用子集表示法来获取后续除法步骤的“收入”行,但它失败了:

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

我也搜索过 Stackoverflow,但找不到答案。我得到的“最接近”的答案是这个post 和这个post。但是,这些帖子不同,因为它们的数据集是长格式(与我的宽格式相反),它们的数据集由组组成(我没有“group_by”),我需要对我正在制作的特定行进行硬编码参考。

非常感谢!谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    大家可以试试dplyr::mutate_at。此外,如果Revenue 预计不会是第一行,那么通用解决方案可以是:

    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
    

    【讨论】:

    • 非常感谢!
    • as.data.frame最后的目的是什么?输出为data.frame,即使在其他情况下也是如此。
    • @DTYK mutate_at 的第二个参数接受column 名称列表,.funs 将应用于这些名称。在您的情况下,选择了 3 列 (year_2014, year_2015, year_2016)。现在funs 将一一应用于所有 3 列。
    • @DTYK,vars 函数是select 操作的替代,因为它允许您在mutatesummarize 操作中直接选择变量,而无需明确需要select 一步。如果要单独执行变量选择,只需在select 操作中使用starts_withselect(starts_with("year"))
    • @DeepakRajendran 你是对的。 as.data.frame 是不需要的。我的习惯是避免使用tibblemulti-line 标头。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多