在R中分割和组合分类数据

时间:2015-07-11 23:37:54

标签: 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来规范薪水列。我已经尝试了if语句并按工资频率进行子集化然后使用rbind,但遗憾的是无法得到结果。

任何帮助将不胜感激。我不确定我是否能够正确描述问题。

谢谢

3 个答案:

答案 0 :(得分: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 :(得分: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]

答案 2 :(得分: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