我的数据框users
包含id
列和country
id country
1 France
2 United States
3 France
我想添加一个新列salary
,该列取决于给定salary
的平均country
。
我的第一个想法是创建一个(country, salary)
的配置向量,如下所示:
salary_country <- c(
"France"=45000,
"United States"=50000,
...)
然后像这样创建列(使用dplyr
):
tbl_df(users) %>%
mutate(salary = ifelse(country %in% names(salary_country),
salary_country[country],
0))
它像魅力一样运行。如果我的salary_country
向量中不存在该国家/地区,则salary
等于0,否则它等于给定的salary
。
但是,在非常大的数据框架上它非常慢并且非常冗长。
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
您可以使用match
:
salary_country[match(users$country, names(salary_country))]
或者去data.table
:
dt = data.table(salary=salary_country, country=names(salary_country))
dt[setDT(users), on='country']
# salary country id
#1: 45000 France 1
#2: 50000 United States 2
#3: 45000 France 3