基于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。错过了。你说得对。我编辑以反映这一点。