首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用另一个数据帧中匹配行的值替换丢失的数据。

用另一个数据帧中匹配行的值替换丢失的数据。
EN

Stack Overflow用户
提问于 2018-12-11 15:59:31
回答 3查看 554关注 0票数 1

我想替换变量的值。

这是我的dB:

代码语言:javascript
复制
head(mydb)

ID   V1     V2     V3     V4 
1    value  value  0    0
2    value  value  0    0  
3    value  value  0    0
4    value  value  0    0  
5    value  value  0    0
6    value  value  0    0  

对于所有的观测,0V3V4都有。

然后,我创建了几个dBs,如下所示:

代码语言:javascript
复制
head(newdb)
ID   V3     V4 
2    5      4  
4    8      5  
6    9      6  

我想得到这样的东西:

代码语言:javascript
复制
ID   V1     V2     V3     V4 
1    value  value  0    0
2    value  value  5    4  
3    value  value  0    0
4    value  value  8    5  
5    value  value  0    0
6    value  value  9    6

我试着用平方这样做:

代码语言:javascript
复制
mydf <- sqldf('SELECT mydf.*, newdb.v3, newdb.v4              
               FROM mydf
               LEFT JOIN newdb 
               ON  mydf.ID = newdb.id')

我创建的代码运行良好,并完成了它的工作;但问题是,我在一个for循环中,对于我的每个newDBsql代码生成其他V3V4,并附加它,关闭前面的代码,创建如下所示:

代码语言:javascript
复制
ID   V1     V2     V3   V4   V3   V4   V3  V4
1    value  value  0    0    1    5    0   0
2    value  value  5    4    0    0    0   0
3    value  value  0    0    0    0    7   8
4    value  value  8    5    0    0    0   0
5    value  value  0    0    2    2    0   0 
6    value  value  9    6    0    0    0   0

我为循环中的每个迭代添加了另一个V3和V4列(在本例中为3次迭代)。

我怎样才能避免这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-11 16:21:51

您可以简单地将两个数据文件中的ID匹配起来,并在原始数据文件中替换它们:

代码语言:javascript
复制
mydf[,c("V3","V4")] <- newdf[match(mydf$ID, newdf$ID),c("V3","V4")]

mydf
#   ID  V1    V2   V3 V4
# 1  1 value value NA NA
# 2  2 value value  5  4
# 3  3 value value NA NA
# 4  4 value value  8  5
# 5  5 value value NA NA
# 6  6 value value  9  6

稍后您可以将NAs替换为0s。

更新:

没有执行for-loop,而是将所有的newdf连接在一起,然后在上面运行代码;请看下面的伪代码:

代码语言:javascript
复制
newdf_concat <- rbind(newdf1, newdf2)

mydf[,c("V3","V4")] <- newdf_concat[match(mydf$ID, newdf_concat$ID),c("V3","V4")]
票数 2
EN

Stack Overflow用户

发布于 2018-12-11 16:05:16

您可以很容易地使用data.table进行更新联接。

代码语言:javascript
复制
library(data.table)
setDT(mydb)
setDT(newdb)

mydb[newdb, on = 'ID', c('V3', 'V4') := .(i.V3, i.V4)]

mydb
#    ID    V1    V2 V3 V4
# 1:  1 value value  0  0
# 2:  2 value value  5  4
# 3:  3 value value  0  0
# 4:  4 value value  8  5
# 5:  5 value value  0  0
# 6:  6 value value  9  6

您也可以使用sqldf,但您必须使用coalesce (与上面的结果相同)

代码语言:javascript
复制
library(sqldf)
sqldf('
SELECT  mydb.ID
        , mydb.V1
        , mydb.V2
        , coalesce(newdb.v3, mydb.V3) as V3
        , coalesce(newdb.v4, mydb.V4) as V4
FROM    mydb
        LEFT JOIN newdb 
          using(id)
')

使用的数据:

代码语言:javascript
复制
mydb <- fread('
ID   V1     V2     V3     V4 
1    value  value  0    0
2    value  value  0    0  
3    value  value  0    0
4    value  value  0    0  
5    value  value  0    0
6    value  value  0    0  
')
newdb <- fread('
ID   V3     V4 
2    5      4  
4    8      5  
6    9      6  
')
票数 3
EN

Stack Overflow用户

发布于 2019-02-26 00:17:29

我们可以使用来自我的包eathttps://github.com/moodymudskipper/safejoin,并在列冲突时将来自rhs的匹配“修补”到rhs中。

代码语言:javascript
复制
# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
library(dplyr)

eat(mydb, newdb, .by = "ID", .conflict = "patch")
#   ID    V1    V2 V3 V4
# 1  1 value value  0  0
# 2  2 value value  5  4
# 3  3 value value  0  0
# 4  4 value value  8  5
# 5  5 value value  0  0
# 6  6 value value  9  6

我们还可以将从rhs开始的列合并起来,以达到同样的效果:

代码语言:javascript
复制
eat(mydb, newdb, .by = "ID", .conflict = ~coalesce(.y,.x))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53727905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档