基于数字变量对因子变量进行排序

时间:2016-03-12 11:24:34

标签: r sorting dataframe

我正在尝试对因子变量类别进行排序,金额列是数字,并且 单位是一个因素,其中(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)

我的问题,是否有更好的方法来实现它?

1 个答案:

答案 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数据集就像之前一样。