2017-08-02 167 views
0

我有兩個非常大的數據幀(5000萬和150萬),其中兩個變量中的一些相同。我需要比較兩者並在一個數據框中添加另一列,以便在另一個數據框中提供匹配觀察值的計數。根據來自另一個數據幀的值計算一個數據幀中觀察值的數量

例如:DF1和DF2都包含id,date,age_grp和性別變量。我想在DF1中添加另一列(match_count),其中顯示了DF1.id = DF2.id和DF1.date = DF2.date和DF1.age_grp = DF2.age_grp和DF1.gender = DF2.gender 注意

DF1

id date age_grp gender val 
101 20140110 1 1  666 
102 20150310 2 2  777 
103 20160901 3 1  444 
104 20160903 4 1  555 
105 20010910 5 1  888 

DF2

id date age_grp gender state 
101 20140110 1 1  10 
101 20140110 1 1  12 
101 20140110 1 2  22 
102 20150310 2 2  33 

在上述示例的組合 「ID = 101,日期= 20140110,age_grp = 1,性別= 1」,在DF2中出現兩次,因此計數2與組合 「ID = 102,日期= 20150010,age_grp = 2,性別= 2」 出現一次,因此計數1.

下面是所產生的數據幀我尋找

結果

id date age_grp gender val match_count 
101 20140110 1 1  666 2 
102 20150310 2 2  777 1 
103 20160901 3 1  444 0 
104 20160903 4 1  555 0 
105 20010910 5 1  888 0 

這裏就是我此刻做,它工作得很好,包括小數據,但對於大數據不能很好地擴展。對於這個例子,即使幾個小時後它也沒有返回任何結果。

注:我已經通過this線消失了,它沒有解決規模問題

with(DF1 
    , mapply(
     function(arg_id,arg_agegrp, arg_gender, arg_date){ 
      sum(arg_id == DF2$id 
       & agegrp == DF2$agegrp 
       & gender_bool == DF2$gender 
       & arg_date == DF2$date) 
      }, 
    id, agegrp, gender, date) 
) 

UPDATE

的ID列是不是唯一的,因此可能有兩個觀察其中id,日期,agegrp和性別可能相同,只有val列可能不同。

回答

3

這裏是什麼,我會用dplyr

df2$state=NULL#noted you do not need column state 
Name=names(df2) 
df2=df2%>%group_by_(.dots=names(df2))%>%dplyr::summarise(match_count=n()) 
Target=merge(df1,df2,by.x=Name,by.y=Name,all.x=T) 
Target[is.na(Target)]=0 

Target 
    id  date age_grp gender val match_count 
1 101 20140110  1  1 666   2 
2 102 20150310  2  2 777   1 
3 103 20160901  3  1 444   0 
4 104 20160903  4  1 555   0 
5 105 20010910  5  1 888   0 
+1

我認爲邏輯是要走的路,但爲什麼不去完整的dplyr並使用'left_join'而不是'merge'? – thelatemail

+0

@thelatemail我只是習慣合併..但是你是對的,我應該改變'合併'加入' – Wen

3

data.table可能會有所幫助這裏也解決了這個問題。按指定的變量聚合DF2,然後將其加回DF1

library(data.table) 
setDT(DF1) 
setDT(DF2) 

vars <- c("id","date","age_grp","gender") 
DF1[DF2[, .N, by=vars], count := N, on=vars] 
DF1 

# id  date age_grp gender val count 
#1: 101 20140110  1  1 666  2 
#2: 102 20150310  2  2 777  1 
#3: 103 20160901  3  1 444 NA 
#4: 104 20160903  4  1 555 NA 
#5: 105 20010910  5  1 888 NA 
+0

感謝您的解決方案。請參閱更新。解決方案的問題是,如果有多個具有相同ID,日期,agegrp,性別和日期列的觀察值,則計數將針對每個組合顯示。所以觀察'101 20140110 1 1 666'和'101 20140110 1 1 999'兩者的計數都等於2.請建議 – Ali

相關問題