我正在尝试对因子变量类别进行排序,金额列是数字,并且 单位是一个因素,其中(B =十亿,M =百万,K =千)
d <- read.table(text="Category Amount Units
A 1.2 B
B 2.4 K
C 3.2 M
A 2.3 B
B 4.5 M
C 6.5 K", header=TRUE, stringsAsFactors = TRUE)
这就是我所做的
d$Total <- ifelse(d$Units=="B", 1000000000, ifelse(d$Units =="M", 1000000, ifelse(d$Units == "K", 1000, 0)))
d$Total <- d$Total * Amount
arrange(d, desc(Amount), Units)
我的问题,是否有更好的方法来实现它?
答案 0 :(得分:2)
我们可以做到
options(scipen=999)
v1 <- as.character(d$Units)
d$Total <- setNames(c(1e9, 1e3, 1e6),unique(v1))[v1]*d$Amount
如果我们需要dplyr
方式
library(dplyr)
d %>%
mutate(Units = as.character(Units),
Total = setNames(c(1e9, 1e3, 1e6),
unique(Units))[Units]*Amount) %>%
arrange(Units, desc(Amount))
# Category Amount Units Total
# 1 A 2.3 B 2300000000
# 2 A 1.2 B 1200000000
# 3 C 6.5 K 6500
# 4 B 2.4 K 2400
# 5 B 4.5 M 4500000
# 6 C 3.2 M 3200000
另一种选择是使用gsubfn
替换值
library(gsubfn)
d$Total <- as.numeric(gsubfn(".", list(B= 1e9, M=1e6,
K=1e3), as.character(d$Units))) * d$Amount
然后arrange
数据集就像之前一样。