使用dplyr创建新标签并计算现有列中的对应值

时间:2018-12-09 09:58:37

标签: r dplyr

我想在现有列(例如A列)中创建一个新标签,并在另一个现有列(例如B列)的同一行中创建一个计算值。

模拟数据如下:

df <- data.frame(date = as.Date(c("31-Dec-2018", "31-Dec-2018", "31-Dec-2018", "30-Sep-2018", "30-Sep-2018", "30-Jun-2018", "30-Jun-2018",
                              "31-Mar-2018", "31-Mar-2018"), format = "%d-%b-%Y"),
             metric = c("Revenue", "Profit", "Restructuring Cost", "Revenue", "Profit", "Revenue", "Profit", "Revenue", "Profit"),
             value = c(100, 50, 10, 100, 50, 90, 44, 97, 60))

共有三列(日期,财务指标以及该特定日期的财务指标的相应值)。例如,我想计算每个日期的净利润率(特定日期的利润除以同一日期的收入)。但是,mutate做错了。它创建一个新的计算列。我希望在现有的“指标”列中创建“净利润”标签,并在“值”列中创建相应的净利润值。

到目前为止,我所做的是(错误的)以下内容:

test <- df %>%
    group_by(date) %>%
    mutate(net_margin = round(value/lag(value), digits = 2))

我也不确定如何调用该指标。我上面的代码使用的是上一行的值,但并非总是如此。

所需的输出如下所示:

Example

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以用summarise date乘以{Profit”处的value来计算“ Revenue”处的比率,并将行绑定到原始数​​据帧。

library(dplyr)

df %>%
  group_by(date) %>%
  summarise(value = round(value[metric == "Profit"]/value[metric == "Revenue"], 2), 
           metric = "Net Margin") %>%
  bind_rows(df) %>%
  arrange(date)


#    date       value metric            
#   <date>      <dbl> <chr>             
# 1 2018-03-31   0.62 Net Margin        
# 2 2018-03-31  97    Revenue           
# 3 2018-03-31  60    Profit            
# 4 2018-06-30   0.49 Net Margin        
# 5 2018-06-30  90    Revenue           
# 6 2018-06-30  44    Profit            
# 7 2018-09-30   0.5  Net Margin        
# 8 2018-09-30 100    Revenue           
# 9 2018-09-30  50    Profit            
#10 2018-12-31   0.5  Net Margin        
#11 2018-12-31 100    Revenue           
#12 2018-12-31  50    Profit            
#13 2018-12-31  10    Restructuring Cost