我有一个由三列组成的数据框。国家,货币和工资。 the sample data
我在这里的担心是,我希望特定国家/地区的所有薪水都使用单一货币。例如,我希望巴西的工资以BSD为单位。因此,无论货币在哪里都不同,这里就是INR,我想将其乘以6.789之类的转换率。同样,我也想为其他国家/地区做。我已经使用if语句编写了一段代码。但是我的薪水列乘以转换率并没有。
if (df$Country == "Brazil"){
if(df$Currency == "INR"){
df$Salary <- df$Salary*2.50
}
}else if(df$Country == "India"){
if(df$Currency == "USD"){
df$Salary <- df$Salary*6.789
}else if (df$Currency == "CHF"){
df$Salary <-df$Salary*5.67
}
}else {
df$Salary <- df$Salary*1
}
我仍然得到与最初工资相同的工资。还有其他方法可以解决吗?
答案 0 :(得分:1)
就像这是您需要定期执行的操作一样,还有更好的自动化选项,包括Tumbledown提到的查找表。
如果无法使用其他方法,并且您仍然需要运行一些条件语句,则可以使用tidyverse来使用mutate和case_when来获得更简洁,更易读的解决方案。
library(dplyr)
df <- df %>%
mutate(Salary = case_when(Country == "Brazil" & Curency == "INR" ~ Salary * 2.5,
Country == "India" & Currency == "USD" ~ Salary * 6.789,
Country == "India" & Currency == "CHF" ~ Salary * 5.67,
TRUE ~ Salary))
答案 1 :(得分:0)
与基数R类似的想法:
country <- c(rep("Brazil", 7), rep("India", 7))
currency <- c(rep("BSD", 4), rep("INR", 5), rep("USD", 3), rep("CHF", 2))
salary <- c(70000, 45000, 13425, 67746, 87852, 18902, 56148,
81871, 98767, 23456, 45688, 98287, 62290, 23623)
dd <- data.frame(country, currency, salary)
conversion <- NULL
conversion$INR2BSD <- 6.789
conversion$INR2CHF <- 4.5
conversion$USD2CHF <- 5
conversion <- data.frame(conversion)
dd$convrate <- 1
dd$convrate[dd$country == "Brazil" & dd$currency == "INR"] <- conversion$INR2BSD
dd$convrate[dd$country == "India" & dd$currency == "INR"] <- conversion$INR2CHF
dd$convrate[dd$country == "India" & dd$currency == "USD"] <- conversion$USD2CHF
dd$conv_salary <- dd$salary * dd$convrate