基于R中的其他数据帧替换数据帧中的值

基于R中的其他数据帧替换数据帧中的值,r,dataframe,R,Dataframe,在下面的示例中,userids是我的参考数据框,userdata是应该进行替换的数据框 > 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'), I

在下面的示例中,
userids
是我的参考数据框,
userdata
是应该进行替换的数据框

> 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

使用
匹配

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

userdata$ID使用
match

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

userdata$ID这里尝试使用
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.Grothendieck的评论,我们用左键替换了内部,得到了结果

 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

这里尝试使用
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.Grothendieck的评论,我们用左键替换了内部,得到了结果

 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
这是一种可能性:

library(qdap)
userdata$FRIENDID <- lookup(userdata$FRIENDID, userids)
userdata$ID <- lookup(userdata$ID, userids)
库(qdap)
userdata$FRIENDID这是一种可能性:

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

userdata$FRIENDID这里有一个可能的解决方案,它也适用于每个ID都有多个记录的数据集,不过我们需要先强制ID和FRIENDID变量为character:

> 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)})

>userdata$ID userdata$FRIENDID这里有一个可能的解决方案,它也适用于每个ID都有多个记录的数据集,不过我们需要先强制ID和FRIENDID变量为character:

> 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)})

>userdata$ID userdata$FRIENDID“正确”是什么意思?您想将
userids$USER
userdata$ID
匹配吗?我想
correct
应该是
correct
。@Robert,获得所需的输出会有帮助(为了避免这些混淆,下次使用)。您所说的“correct”是什么意思?您想将
userids$USER
userdata$ID
匹配吗?我想
正确的
应该是
对应的
@Robert,获得所需的输出会有帮助(为了避免这些混淆,下次再做)。关于您的问题,请将
内部的两个实例替换为
左侧的
。关于您的问题,请将
内部的两个实例替换为
左侧的
qdap
看起来很不错,但我在我的存储库中没有看到。不确定原因。可能是因为它是一个更新的版本。请尝试安装.packages(“qdap”)
,或者您可以使用:
库(devtools)
为开发人员安装github(“qdap”、“trinker”)
。版本。失败<代码>错误:依赖项“openNLP”不适用于包“qdap”
您使用的是什么操作系统?如果你必须从源代码编译。详情见此:@agstudy。错过了。你说得对。我编辑以反映这一点。
qdap
看起来很不错,但我在我的存储库中没有看到它。不知道为什么。可能是因为它是一个更新的版本。请尝试安装.packages(“qdap”)
,或者您可以使用:
库(devtools)
为开发人员安装github(“qdap”、“trinker”)
。版本。失败<代码>错误:依赖项“openNLP”不适用于包“qdap”
您使用的是什么操作系统?如果你必须从源代码编译。详情见此:@agstudy。错过了。你说得对。我编辑以反映这一点。