2015-07-11 67 views
1

如果我沒有使用正確的術語,我是新來的R,所以很抱歉。我已經尋找解決以下問題的解決方案,但目前找不到。R中分類和組合分類數據

我有一個有薪水數據的數據框。 例如,

Agency  Position Title Salary Frequency Salary 
    abc   BA    Hourly   40 
    xyz   QA    Daily    30 
    new   Java Developer  Annual   80000 
    old   .net Developer  Annual   70000 

我試圖通過每小時收費52 * 40以及每日52 * 5乘以正常化工資列。我已經嘗試過如果按照工資頻率進行陳述和子集化,然後使用rbind,但很遺憾無法獲得結果。

任何幫助將不勝感激。我不確定我是否能夠正確描述問題。

感謝

回答

3
levels(df$Salary.Frequency) <- c(1, 52*5, 52*40) 
df$Salary <- as.numeric(as.character(df$Salary.Frequency))*df$Salary 
levels(df$Salary.Frequency) <- c("Annual", "Daily", "Hourly") 
df 
# 1 abc    BA   Hourly 83200 
# 2 xyz    QA   Daily 7800 
# 3 new Java.Developer   Annual 80000 
# 4 old .net.Developer   Annual 70000 

我用來因素levels功能。我無法直接將「頻率」列與「薪資」列相乘。因爲它屬於factor類,所以在算術運算之前,它必須首先包含在冗長的as.numeric(as.character(f))或更古老的as.numeric(levels(f))[f]中。附註:你乘以52;那些小時工和日常工人都沒有休假? :)

數據

df <- read.table(text="Agency  Position.Title Salary.Frequency Salary 
    abc   BA    Hourly   40 
    xyz   QA    Daily    30 
    new   Java.Developer  Annual   80000 
    old   .net.Developer  Annual   70000", header=T) 
+1

非常感謝。這是一個創造性的答案。回答附註:也許在這種情況下,他們不會:) – datageek

2

我最舒適的工作在data.table;這裏是我會怎麼做:

library(data.table) 
setDT(df) 
df[,Salary:=Salary*(52^(Salary.Frequency!="Annual"))* 
    (5^(Salary.Frequency=="Daily"))* 
    (40^(Salary.Frequency=="Hourly"))] 
> df 
    Agency Position.Title Salary.Frequency Salary 
1: abc    BA   Hourly 83200 
2: xyz    QA   Daily 7800 
3: new Java.Developer   Annual 80000 
4: old .net.Developer   Annual 70000 

這可能是更容易消化將是一個另類:

df[Salary.Frequency=="Daily",Salary:=200*Salary] 
df[Salary.Frequency=="Hourly",Salary:=40*52*Salary] 
0

這裏是一個dplyr解決方案有兩個嵌套ifelse

library(dplyr) 
df %>% mutate(Salary = ifelse(Salary.Frequency == "Hourly", 
             (Salary * 52 * 40), 
           ifelse(Salary.Frequency == "Annual", 
             Salary, (Salary * 52 * 5) 
             ))) 

Agency Position.Title Salary.Frequency Salary 
1 abc    BA   Hourly 83200 
2 xyz    QA   Daily 7800 
3 new Java.Developer   Annual 80000 
4 old .net.Developer   Annual 70000