2013-02-25 210 views
9

在下面的示例中,userids是我的參考數據幀,userdata是應發生替換的數據幀。根據R中的其他數據幀替換數據幀中的值

> userids <- data.frame(USER=c('Ann','Jim','Lee','Bob'),ID=c(1,2,3,4)) 
> userids 
    USER ID 
1 Ann 1 
2 Jim 2 
3 Lee 3 
4 Bob 4 

> userdata <- data.frame(INFO=c('foo','bar','foo','bar'), ID=c('Bob','Jim','Ann','Lee'),AGE=c('43','33','53','26'), FRIENDID=c('Ann',NA,'Lee','Jim')) 
> userdata 
    INFO ID AGE FRIENDID 
1 foo Bob 43  Ann 
2 bar Jim 33  NA 
3 foo Ann 53  Lee 
4 bar Lee 26  Jim 

如何對應於用戶userids的ID代替ID和FRIENDID在userdata

所需的輸出:

INFO ID AGE FRIENDID 
1 foo 4 43  1 
2 bar 2 33  NA 
3 foo 1 53  3 
4 bar 3 26  2 
+0

「正確」是什麼意思?你想匹配'userids $ USER'到'userdata $ ID'嗎? – 2013-02-25 15:10:01

+1

我猜「正確」應該是「相應」的。 – Arun 2013-02-25 15:14:19

+0

@Robert,它有助於獲得所需的輸出(以避免這些混亂,下次)。 – Arun 2013-02-25 15:15:04

回答

16

使用match

userdata$ID <- userids$ID[match(userdata$ID, userids$USER)] 
userdata$FRIENDID <- userids$ID[match(userdata$FRIENDID, userids$USER)] 
0

這裏使用sqldf爲多對型動物列加入到得到結果一試。

library(sqldf) 
    sqldf('SELECT d.INFO,d.AGE,i1.ID ,i2.ID FRIENDID 
     FROM 
     userdata d 
     INNER JOIN 
     userids i1 ON (i1.USER=d.FRIENDID) 
     INNER JOIN 
     userids i2 ON (i2.USER=d.ID)') 

INFO AGE ID FRIENDID 
1 foo 43 1  4 
2 foo 53 3  1 
3 bar 26 2  3 

但是,這會刪除NA行!也許有人可以建議我如何處理NA的東西!

編輯

感謝G.格羅騰迪克評論,由左更換內部我們得到的結果。

sqldf('SELECT d.INFO,d.AGE,i1.ID ,i2.ID FRIENDID 
     FROM 
     userdata d 
     LEFT JOIN 
     userids i1 ON (i1.USER=d.FRIENDID) 
     LEFT JOIN 
     userids i2 ON (i2.USER=d.ID)') 
INFO AGE ID FRIENDID 
1 foo 43 1  4 
2 bar 33 NA  2 
3 foo 53 3  1 
4 bar 26 2  3 
+0

關於你的問題,用'LEFT'替換'INNER'的兩個實例。 – 2013-02-25 17:04:55

1

這是一個可能性:

library(qdap) 
userdata$FRIENDID <- lookup(userdata$FRIENDID, userids) 
userdata$ID <- lookup(userdata$ID, userids) 

或贏得一行獎:

userdata[, c(2, 4)] <- lapply(userdata[, c(2, 4)], lookup, key.match=userids) 
+0

'qdap'看起來非常棒,但我沒有在我的存儲庫中看到它。 – N8TRO 2013-02-26 07:50:48

+1

不知道爲什麼。也許這是因爲它是一個更新的版本。嘗試'install.packages(「qdap」)'或者你可以使用:'library(devtools)' 'install_github(「qdap」,「trinker」)''版。 – 2013-02-26 08:00:49

+0

失敗。 '錯誤:依賴關係'openNLP'不可用於包'qdap'' – N8TRO 2013-02-26 08:04:47

0

這裏有一個可能的解決方案,這也將與每個多個記錄的數據集工作ID,儘管我們需要首先強制ID和FRIENDID變量:

> userdata$ID <- sapply(userdata$ID, function(x){gsub(x, userids[userids$USER==x, 2], x)}) 
> userdata$FRIENDID <- sapply(userdata$FRIENDID, function(x){gsub(x, userids[userids$USER==x, 2], x)}) 
相關問題