用另一个表替换列

时间:2017-07-03 09:10:14

标签: r

假设我的df如下所示。

df <- read.table(textConnection("
id1 id2 id3       inter
  1   2   3       7.343
  6   5   4       2.454
  1   5   6       3.234
"), header = TRUE)

我希望按源数据框替换列id1id2id3

source <- read.table(textConnection("
sid rid 
  1   a
  2   b
  3   c
  4   43454
  5   2254 
  6   43
"), header = TRUE)

如果我发现source$sid等于df$id1df$id2df$id3, 然后我想将它们替换为source$rid

结果我可以看到。

id1 id2 id3 inter
  a   b   c  7.343   
 43 2254 43454 2.454
  a   2254 43  3.234

请提示吗?

2 个答案:

答案 0 :(得分:2)

tmp <- as.matrix(df[paste0("id", 1:3)]) 
ind <- match(tmp, source$sid)
tmp[] <- as.character(source$rid)[ind]
df[paste0("id", 1:3)] <- tmp

答案 1 :(得分:1)

您可以再次使用tidyversegatherleft_join然后spread,即

library(tidyverse)

df %>% 
 gather(var, sid, -inter) %>% 
 left_join(source, by = 'sid') %>% 
 select(-sid) %>% 
 spread(var, rid)

#  inter id1  id2   id3
#1 2.454  43 2254 43454
#2 3.234   a 2254    43
#3 7.343   a    b     c

根据您的评论,您似乎有一些重复。以下var分组并创建seq个唯一值就足够了(虽然我无法测试,因为您的示例不会产生此错误),

df %>% 
  gather(var, sid, -inter) %>% 
  left_join(source, by = 'sid') %>% 
  select(-sid) %>% 
  group_by(var) %>% 
  mutate(new = seq(n())) %>% 
  spread(var, rid) %>% 
  select(-new)