首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过匹配其他列将表列中的某些记录替换为另一个表

通过匹配其他列将表列中的某些记录替换为另一个表
EN

Stack Overflow用户
提问于 2016-05-26 07:57:47
回答 3查看 77关注 0票数 2

我想用另一个表t2替换t1$x3中的一些记录(注意,除x3外,所有其他列都是相同的):

代码语言:javascript
复制
t1 <- data.frame(x1 = c(1,7,3,4,2,6),
                 x2 = c("I","R","R","I","I","R"),
                 x3 = c("a","a","a","a","a","a"))
t2 <- data.frame(x1 = c(4,2,6),
                 x2 = c("I","I","R"),
                 x3 = c("b","b","b"))
t1
#   x1 x2 x3
# 1  1  I  a
# 2  7  R  a
# 3  3  R  a
# 4  4  I  a
# 5  2  I  a
# 6  6  R  a

t2
#   x1 x2 x3
# 1  4  I  b
# 2  2  I  b
# 3  6  R  b

结果应该是这样的:

代码语言:javascript
复制
data.frame(x1 = c(1,7,3,4,2,6),
           x2 = c("I","R","R","I","I","R"),
           x3 = c("a","a","a","b","b","b"))

#   x1 x2 x3
# 1  1  I  a
# 2  7  R  a
# 3  3  R  a
# 4  4  I  b
# 5  2  I  b
# 6  6  R  b

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-26 08:14:33

然后左联接更新:

代码语言:javascript
复制
library(dplyr)

left_join(t1, t2, by = c("x1", "x2"), all.x = TRUE) %>% 
  mutate(x3 = ifelse(is.na(x3.y), as.character(x3.x), as.character(x3.y))) %>% 
  select(-c(x3.x, x3.y))

#   x1 x2 x3
# 1  1  I  a
# 2  7  R  a
# 3  3  R  a
# 4  4  I  b
# 5  2  I  b
# 6  6  R  b

使用R基:

代码语言:javascript
复制
# left join 
res <- merge(t1, t2, by = c("x1", "x2"), all.x = TRUE)
# update x3
res$x3 <- ifelse(is.na(res$x3.y), as.character(res$x3.x), as.character(res$x3.y))
# subset and reorder
res <- res[match(t1$x1, res$x1), c("x1", "x2", "x3")]
票数 3
EN

Stack Overflow用户

发布于 2016-05-26 08:52:41

我们可以试试data.table。它应该非常快,因为我们正在分配(:=)到位。将'data.frame‘转换为'data.table’(setDT(t1)),加入't2‘on 'x1’和'x2',然后将'i.x3‘值赋给'x3’。

代码语言:javascript
复制
library(data.table)
setDT(t1)[t2, x3 := i.x3, on = c("x1", "x2")]
t1
#   x1 x2 x3
#1:  1  I  a
#2:  7  R  a
#3:  3  R  a
#4:  4  I  b
#5:  2  I  b
#6:  6  R  b

或者我们可以使用match

代码语言:javascript
复制
t1$x3 <- factor(t1$x3, levels = c('a','b'))
t1[match(do.call(paste,t2[-3]), do.call(paste, t1[-3])), 'x3'] <- t2$x3
t1
# x1 x2 x3
#1  1  I  a
#2  7  R  a
#3  3  R  a
#4  4  I  b
#5  2  I  b
#6  6  R  b
票数 2
EN

Stack Overflow用户

发布于 2016-05-26 08:48:07

我想这会给你你想要的。

x3列转换为t1t2中的字符,然后检查条件

代码语言:javascript
复制
t1$x3 <- as.character(t1$x3)
t2$x3 <- as.character(t2$x3)
t1[t1$x1 %in% t2$x1 & as.character(t1$x2) %in% as.character(t2$x2), "x3"] <- t2$x3

> t1
#  x1 x2 x3
#1  1  I  a
#2  7  R  a
#3  3  R  a
#4  4  I  b
#5  2  I  b
#6  6  R  b
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37454868

复制
相关文章

相似问题

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