我有兩個非常大的數據幀(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列可能不同。
我認爲邏輯是要走的路,但爲什麼不去完整的dplyr並使用'left_join'而不是'merge'? – thelatemail
@thelatemail我只是習慣合併..但是你是對的,我應該改變'合併'加入' – Wen