繁体   English   中英

如何根据 R 中的特定分类列值创建两个金额列

[英]How to Create Two Amount Columns Based on Specific Categorical Column Values in R

我对 R 比较陌生,我有一个如下所示的数据框:

1 2 3 4 5 6 7 8 9 10
姓名 最大限度 最大限度 最大限度 乔伊 乔伊 南希 南希 南希 琳达 琳达
金额类型 互联网账单 杂货 水单 互联网账单 杂货 水单 杂货 互联网账单 水单 杂货
数量 75 美元 230.66 美元 40 美元 70 美元 188.75 美元 35 美元 175.89 美元 75 美元 30 美元 236.87 美元

我需要再添加 3 行并旋转数据框:

数据框需要按名称分组并输出 3 个总计列:

  1. Fixed_Cost 应包括 InternetBill 和 WaterBill 金额
  2. Variable_Cost 应包括杂货
  3. Total_Cost 应该是固定的 + 可变成本

所以是这样的:

姓名 固定成本 可变成本 总消耗
最大限度 115 美元 230.66 美元 345.66 美元
乔伊 70 美元 188.75 美元 258.75 美元
南希 110 美元 175.89 美元 285.89 美元
琳达 30 美元 236.87 美元 266.87 美元

关于如何去做这件事的任何建议? 谢谢!

library(tidyverse)   

setNames(data.frame(t(df1[,-1])), df1[,1]) %>%
  pivot_wider(Name, names_from = Amount_Type, values_from = Amount,
              values_fn = parse_number, values_fill = 0) %>%
  mutate(Fixed_cost = InternetBill + WaterBill, variable_cost = Groceries,
         Total_Cost = Fixed_cost + variable_cost, .keep ='unused')

# A tibble: 4 x 4
  Name  Fixed_cost variable_cost Total_Cost
  <chr>      <dbl>         <dbl>      <dbl>
1 Max          115          231.       346.
2 Joey          70          189.       259.
3 Nancy        110          176.       286.
4 Linda         30          237.       267.

如果我们transpose数据,那么按sum进行分组会变得更容易

library(data.table)
data.table::transpose(setDT(df1), make.names = 1)[, 
  Amount := readr::parse_number(Amount)][, 
 .(Fixed_Cost = sum(Amount[Amount_Type %in% c("InternetBill", "WaterBill")]), 
 Variable_Cost =  sum(Amount[!Amount_Type %in% c("InternetBill", "WaterBill")])),
       by = Name][,
   Total_Cost := Fixed_Cost + Variable_Cost][]

-输出

     Name Fixed_Cost Variable_Cost Total_Cost
   <char>      <num>         <num>      <num>
1:    Max        115        230.66     345.66
2:   Joey         70        188.75     258.75
3:  Nancy        110        175.89     285.89
4:  Linda         30        236.87     266.87  

数据

df1 <- structure(list(`0` = c("Name", "Amount_Type", "Amount"), `1` = c("Max", 
"InternetBill", "$75"), `2` = c("Max", "Groceries", "$230.66"
), `3` = c("Max", "WaterBill", "$40"), `4` = c("Joey", "InternetBill", 
"$70"), `5` = c("Joey", "Groceries", "$188.75"), `6` = c("Nancy", 
"WaterBill", "$35"), `7` = c("Nancy", "Groceries", "$175.89"), 
    `8` = c("Nancy", "InternetBill", "$75"), `9` = c("Linda", 
    "WaterBill", "$30"), `10` = c("Linda", "Groceries", "$236.87"
    )), class = "data.frame", row.names = c(NA, -3L))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM