[英]Create a new categorical “comparison detection” column based on two other columns in R (nine option answers)
[英]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 个总计列:
所以是这样的:
姓名 | 固定成本 | 可变成本 | 总消耗 |
---|---|---|---|
最大限度 | 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.