如何用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語言,用merge2. 為了解決問題,用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_joinsqldf包調用sql語句的leftjoin
用data.table包,會快很多。這個包也提供merge函數。
推薦閱讀:
※r 如何更新,不需要重裝的手段進行更新?
※R語言 安裝完軟體後如何進行界面語言的設置?
※有哪些比較好的R語言網路視頻教程推薦?
※如何理解R中因子(factor)的概念?
※R語言在哪些情況下for循環可以避免?