用另一个表替换列

问题描述:

假设我有一个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$id2,或者df$id3, 那么我想替换他们作为source$rid

因此我可以看到。

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

有什么提示吗?

+0

尝试'DF [] akrun

您可以使用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) 
+0

谢谢,但是当我使用你的脚本到另一个数据集,我得到抱怨**错误:行重复标识符(5464,5465,5467 ..... **,知道为什么? – user3058889

+1

@ user3058889。是的,你有重复(var,sid,-inter)%>%left_join(source,by ='sid')%>%select(-sid)%>%group_by(var)%> %mutate(new = seq(n()))%>%spread(var,rid)%>%select(-new) – Sotos

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 
+0

感谢您的帮助,但您的脚本只能用于第一次替换,但是如果我在'df'文件中重复了元素?因为在我的情况下,我在'id1','id2'和'id3'列有几个重复。我更新了我的问题。 @F。 Privé – user3058889

+0

我知道我做错了什么。尝试切换匹配中的元素,然后使用tmp []

+0

我已经使用这个更好的解决方案编辑了我的答案。 –