2013-06-21 165 views
0

添加值以在數據幀列X尋找替換/在數據幀的y值中的R添加值以在數據幀列X尋找替換/在數據幀的y值中的R

臨時文件或X是非常大的數據幀

 1  idname 3 unit 
     aa jhn  cc NA 
     dd m234  ff NA 
     gg cind  ii NA 
     nn .... 
     pp..... 

地圖文件或Y是一個小的數據幀

name id   contact  address 
john jhn   J123  J 
Mary Mry   M234  M 

我的條件

for(i in 1:length(x$1)) { 
    if (X$2==Y$alt_name1 || X$2==Y$alt_name2 || X$2==Y$alt_name3) 
    X$name[i] = Y$name[i] 
} 

也就是說,如果任何除Y $名稱中的Y columsn的值與X $ 2對應的Y $名稱應在X $名確切行添加值匹配

有沒有什麼有效的方法開展這項行動? x有幾百萬行,y有4行。

任何幫助,非常感謝。

我現在有什麼是

for (i in 1: length(tempFile$unit)) { 
    for (j in 1: length(mapFile$Name)) { 
     if (tempFile$idname[i]==mapFile$id[j]) 
     elseif (tempFile$idname[i]==mapFile$contact[j]) 
     elseif (tempFile$idname[i]==mapFile$address[j])    
     tempFile$unit[i] <- mapFile$Name[j] 
     } 
    } 
+3

你可以使用'dput'之類的東西來編輯一個[可重現的例子](http://stackoverflow.com/a/5963610/1188479),包括實際的數據集結構(或一個抽取的版本)嗎?這將使答案更容易。 Offhand我認爲你正在尋找一個包含'merge'的答案,但是如果沒有一個可重複的例子,我不能爲你的問題提供一個可靠的答案。 –

+0

感謝亞當我試圖弄清楚如何編輯並使其格式正確 –

+0

可以說x有幾百萬行,y有4到5行 –

回答

0
big.df <- read.table(text = "1  2  3 name 
aa jhn cc NA 
dd m234 ff NA 
gg cind ii NA", 
        header = TRUE, check.names=FALSE, as.is = TRUE) 

small.df <- read.table(text = "name alt_name1  alt_id alt_name3 
john jhn   J123  J 
Mary Mry   M234  M", 
         header = TRUE, check.names=FALSE, as.is = TRUE) 


alt.names <- big.df[, 1:3] 

alt.key <- small.df[, 2] 

ifelse(alt.names[, 1] %in% alt.key | 
     alt.names[, 2] %in% alt.key | 
     alt.names[, 3] %in% alt.key, alt.key, NA) 

這樣的事情應該工作。顯然你會想幹點它,但ifelse是矢量化的,你可以簡單地將結果傳遞到的name列。你也可以在沒有ifelse的情況下使用match%in%(它只是作爲一個二元運算符匹配),它將比循環快得多。

+0

亞當,謝謝。 –