2016-03-12 105 views
1

我試圖排序因子變量類別,所述金額柱是數字,並且 單位是一個因素,其中(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)

我的問題,有沒有acheiving它的更好的辦法?

回答

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數據集如前所述。