2013-02-25 300 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)})