2016-04-22 53 views
0

我有一個數據幀users與列idcountryR:填充取決於值的列和向量

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

但是,它在非常大的數據幀上非常慢,而且非常冗長。

有沒有更好的方法來實現它?

+2

製作'salary_country'一個'data.frame' /'data.table'和'合併()'他們與所有= TRUE',這將給你一個NA,沒有平均工資,這是國際海事組織比輸入'0'更好。編輯:請參閱http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right –

+0

如果OP使用'data.table',則無需顯式'合併' ...'on'屬性加上'data.table'合併語法就足夠了。請參閱小插圖。 –

回答

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 
+0

感謝您的回覆,合併是一個好主意。我終於使用了dplyr包中的left_join,但這與你的答案是一樣的。 –