2017-08-13 87 views
0

我試圖用名爲zipless的另一個表中的zipcode替換df表中的空白(缺失)zipcode。 什麼是最好的方法? for循環可能非常緩慢。R中的條件查找

我正在嘗試這樣的事情,但它不起作用。

df$zip_new <- ifelse(df, is.na(zip_new), 
        left_join(df,zipless, by = c("contbr_nm" = "contbr_nm")), 
        zip_new) 

我能夠使用這種方法使其工作,但我相信它不是最好的。 我首先在查找表中添加了一個新列,然後在下一步中根據需要選擇性地使用它。

library(dplyr) 
#temporarly renaming the lookup column in the lookup table 
zipless <- plyr::rename(zipless, c("zip_new"="zip_new_temp")) 
#adding the lookup column to the main table 
df <- left_join(df, zipless, by = c("contbr_nm" = "contbr_nm")) 
#taking over the value from the lookup column zip_new_temp if the condition is met, else, do nothing. 
df$zip_new <- ifelse((df$zip_new == "") & 
           (df$contbr_nm %in% zipless$contbr_nm), 
          df$zip_new_temp, 
          df$zip_new) 

什麼是適當的方法來做到這一點?

非常感謝!

+1

[重現數據(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例如)。即使是幾個玩具數據集。你可以在你的一些上使用'dput'或者創建一些解釋這個問題的東西。還包括你想要的輸出。就目前來看,你的問題太模糊了。此外,請包括您正在使用的軟件包的名稱:'left_join'不是基本的R函數。 – lmo

+1

使用coalesce()函數,即。 df $ zip_new < - coalesce(df $ zip_new,df $ zip_new_temp) –

+1

請注意'coalesce'位於'dplyr'包中。 –

回答

3

我建議使用match來抓住你需要的拉鍊。喜歡的東西:

miss_zips = is.na(df$zip_new) 
df$zip_new[miss_zips] = zipless$zip_new[match(
    df$contbr_nm[miss_zips], 
    zipless$contbr_nm 
)] 

無採樣數據我不能完全確定你的列名,但這樣的事情應該工作。

1

我只能爲這類東西推薦data.table -package。但是你的一般方法是正確的。 data.table -package具有更好的語法,用於處理大型數據集。

data.table它可能是這樣的:

zipcodes <- data.table(left_join(df, zipless, by = "contbr_nm")) 
zipcodes[, zip_new := ifelse(is.na(zip_new), zip_new_temp, zip_new)] 
+0

來自'dplyr'包的'left_join'? – www

+0

是的,對不起以上提及。這裏你去:https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf – Trgovec

+0

對於'data.table'的答案,你可以使用'data.table '對於連接,你可以使用'zipcodes < - merge(df,zipless,by =「contbr_nm」,all.x = T)'或[如這裏建議](https://stackoverflow.com/a/34600831/ 903061) – Gregor