我是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,但遗憾的是无法得到结果。
任何帮助将不胜感激。我不确定我是否能够正确描述问题。
谢谢
答案 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