2013-09-30 77 views
0

我有兩個表格:df.authordf.post,它們通過一對多關係相關。現在我更改了主鍵df.author,並且我想要df.post來鏡像更改。在下列R-腳本我用match()while循環與df.author的舊的主鍵來比較每一行的外鍵df.post和當他們與新的匹配替換外鍵一個(形成不同的列df.author)。請考慮以下幾點:比較兩個向量一次一個值而不使用WHILE

foreignkey <- c("old_pk1","old_pk2","old_pk3","old_pk4","old_pk5","old_pk1","old_pk7") 
df.post <- data.frame(foreignkey,stringsAsFactors=FALSE) 
rm(foreignkey) 

primarykey_old <- c("old_pk1","old_pk2","old_pk3","old_pk4","old_pk5") 
primarykey_new <- c("new_pk1","new_pk2","new_pk3","new_pk4","new_pk5") 
df.author <- data.frame(primarykey_old, primarykey_new, stringsAsFactors=FALSE); 
rm(primarykey_old); rm(primarykey_new) 

i <- 1; N <- length(df.post$foreignkey) 
while (i <= N) { 
    match <- match(df.post$foreignkey[i], df.author$primarykey_old) 
    if (!is.na(match)) { 
    df.post$foreignkey[i] <- df.author$primarykey_new[match] 
    } 
    i <- i + 1 
} 
rm(N); rm(i); rm(match) 

腳本工作,但由於while不適合大數據集高效擴展。我讀過使用apply()(在我的情況下通過轉換爲矩陣)通常比使用while更好。我想知道這是否也適用於我的情況。因爲如果你看看你看到的循環,我需要遍歷數據幀的每一行以獲取外鍵,然後通過df.author獲得match()。 我可以通過不使用while來壓縮計算時間嗎?

+0

這是拼寫錯誤:'as.Character'。如果這確實存在一個多種可能性的問題,那麼您可以構建一個展示該特徵的數據集 –

+0

對不起,該行由'stringsAsFactors = FALSE'冗餘' – CptNemo

+0

第二個問題仍未解決。我懷疑它使我所給的答案無效,但現在您有責任構建一個反例。 –

回答

1

我認爲這可能會在無迴路的方式做的一切:

df.post$foreignkey[ 
    !length(match(df.post$foreignkey, df.author$primarykey_old))==0] <- # the test 
    df.author$primarykey_new[match(df.post$foreignkey, df.author$primarykey_old)] 

邏輯:只有當存在一個匹配,那麼替換匹配的值的現有價值。

+0

如果我理解正確'match()'只返回第一個匹配。那麼,如果'df.post $ foreignkey'中有重複的值,這裏會發生什麼? (這是從'df.post'到'df.author'的多對一關係)。我可以檢查它確實有效,我只是不明白如何...... – CptNemo

+0

我編輯了我的問題,以增加'foreignkey'中'primarykey_old'中不存在的值的情況。通過這個解決方案,'foreignkey'中的不匹配值被替換爲空值。是否可以修改'foreignkey'中的值以便匹配? – CptNemo