如何用R語言匹配兩個表的數據?

我有兩個表,一個表是總表,大約50萬條數據,另一個是分表,每個5000條,有七八個。兩個表有統一的標誌碼做對應,需要把總表的一個欄位錄到分表中。我現在用的最簡單的兩個for循環嵌套遍歷總表,發現效率低的可怕,12小時過了勉強跑了2800條。我最近剛學R語言所以想問問有沒有什麼好的包或者演算法推薦的。


有兩個思路:

  • 可以嘗試使用merge(),估計效率也會比較低。

  • 先把所有表根據外鍵(標誌碼)按一定規則排好序,使用subsetting功能分割總表,再使用cbind()函數合併需要添加的欄位。


R處理超大數據是很慢的,因為要把數據整塊地一遍遍地載入內存,所以能用並行操作就別用循環。

這種表單型的數據直接用AWK把相應欄位提取出來,數據容量會減少很多很多吧。。。


推薦用data.table格式存儲兩個表,用dplyr包進行數據操作,示例代碼以下:

library("data.table")
library("dplyr")
#A為總表
A&<-data.table(X=c("a","b","c","d","e"),Y=c(1,2,3,4,5),Z=c("num1","num2","num3","num4","num5")) A #B為分表 B&<-data.table(X=c("c","d","e"),Y=c(4.4,5.5,6.6)) B #合併總表A內的Z值到分表B內,因為A、B兩表有相同欄位Y,故合併結果會有Y.x(原屬於B) Y.y(原屬於A) left_join(B,A,by="X")

運行截圖如下:



不要用base r的函數拉。用dplyr的各種join, 用data.table的merge都可以很快解決問題。如果機器內存比較小可以用RSQLite, 把數據存成sqlite database放在硬碟里, 然候寫個sql操作一下就好了。硬碟多大數據就能放多大。


1. 為了學習R語言,用merge

2. 為了解決問題,用Excel,用資料庫

使用工具是為了解決問題,哪個更有效用哪個


這種問題其實最好是在SQL裡面做,一個連接也就解決了。

不過看到你用了兩個for循環,有點意外。如果我做的話應該會用which()函數來做:

#totaldata是總表,subdata是分表分表,標識欄位是id,tar欄位目前在總表第n列,想加入到分表;
#先對totaldata和subdata排序,保證順序一致;
totaldata&<-totaldata[order(totaldata$id),] subdata&<-subdata[order(subdata$id),] #根據subdata裡面的id,從totaldata裡面取出第n列,即totaldata$tar列 tarcol&<-totaldata[which(totaldata$id==subdata$id),n] #把這一列bind到subdata即可 subdata&<-cbind(subdata,tarcol)

善用which()應該能比用循環效率快很多,which()裡面可以寫多個條件來滿足匹配需求。

啊,打字好累啊。


用merge啊

m &<- merge(Sheet1,Sheet2, by.x = "id", by.y = "ID")


我等懶人一般就用sqldf。


覺得樓上各位的答案都是exact match。我做的data很亂,只能用score來看匹配度。(比如1是完全匹配,0是完全不匹配)(具體方法 jarowinkler, jaccard, osa, soundex...)。

試試apply吧,可能比loop快,如果你做的是dirty data並且需要fuzzy match.

r - Call apply-like function on each row of dataframe with multiple arguments from each row


dplyr包left_join

sqldf包調用sql語句的leftjoin


用data.table包,會快很多。

這個包也提供merge函數。


推薦閱讀:

r 如何更新,不需要重裝的手段進行更新?
R語言 安裝完軟體後如何進行界面語言的設置?
有哪些比較好的R語言網路視頻教程推薦?
如何理解R中因子(factor)的概念?
R語言在哪些情況下for循環可以避免?

TAG:演算法 | R編程語言 |