2017-07-03 131 views
1

假設我有一個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 [] < - lapply(DF,函數(X ){i1 < - match(x,source $ sid); i2 < - !is.na(i1); x [i2] < - as.character(source $ rid)[i1 [i2]]; x})' – akrun

回答

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

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

感謝您的幫助,但您的腳本只能用於第一次替換,但是如果我在'df'文件中重複了元素?因爲在我的情況下,我在'id1','id2'和'id3'列有幾個重複。我更新了我的問題。 @F。 Privé – user3058889

+0

我知道我做錯了什麼。嘗試切換匹配中的元素,然後使用tmp [] < - as.character(source $ rid)[ind] –

+0

我已經使用這個更好的解決方案編輯了我的答案。 –

相關問題