2017-03-09 195 views
0

我有,列出了每個站點如何在R中應用多個if語句?

Site   Country 
Site1   USA 
Site2   Vietnam 
Site3   Spain 
Site4   Germany 
Site5   China 

我要附加列,其中每個國家我其相應的關聯大陸相關的國家數據幀(DF)。我寫了一個簡單if loop做到這一點:

df$Continent <- NA 
if(df$Country == "USA" |df$Country == "Canada" |df$Country == "Mexico") 
{df$Continent <- "North America"} 
if(df$Country == "Spain" |df$Country == "France" |df$Country == "Germany") 
{df$Continent <- "Europe"} 
## .. etc 

summary(df) 

然而,每次我運行它的DF,我發現它分配北美的所有國家。我知道這可能聽起來微不足道,但是如果我在全球各地使用if陳述而不是elseif else,它會有所幫助嗎?任何建議來糾正這個?

+2

'if'和'ifelse'根本不相同。你可能更好使用查找表的排序 - http://stackoverflow.com/questions/18456968/how-do-i-map-a-vector-of-values-to-another-vector-with-我的自定義地圖在r/18457055 – thelatemail

回答

1

我喜歡ifelse()這樣的事情。你可以用%in%運營商像這樣使用它:

df$Continent <- ifelse(df$Country %in% c("USA", "Canada", "Mexico"), 
         "North America", df$Continent) 
df$Continent <- ifelse(df$Country %in% c("Spain", "France", "Germany"), 
         "Europe", df$Continent) 
df 
    Site Country  Continent 
1 Site1  USA North America 
2 Site2 Vietnam   <NA> 
3 Site3 Spain  Europe 
4 Site4 Germany  Europe 
5 Site5 China   <NA> 
+0

我得到以下錯誤'錯誤在$ < - 。data.frame'('* tmp *',「Continent」,value = logical(0)):替換有0行,數據有1000' ## {我的原始數據有1000個值} – Ash

+0

您必須先執行'df $ Continent < - NA'首先可能是 – thelatemail

+0

我的不好。我完美地完成了這項工作 – Ash

5

建立一個查找表和與數據merge()它。

例如:

lookup <- data.frame(Country = c("USA", "Canada", "Mexico", 
           "Spain", "France", "Germany", 
           "Vietnam", "China"), 
        Continent = rep(c("North America", "Europe", "Asia"), 
            times = c(3,3,2))) 

使用您的數據作爲數據幀df的片段中,我們可以通過添加merge()Continent(在數據庫術語聯接):

> merge(df, lookup, sort = FALSE, all.x = TRUE) 
    Country Site  Continent 
1  USA Site1 North America 
2 Vietnam Site2   Asia 
3 Spain Site3  Europe 
4 Germany Site4  Europe 
5 China Site5   Asia 
+0

儘管我想使用國家,但我需要根據美國的狀態將美國劃分爲北部和南部地區..這是另一列。所以,我可能不得不喜歡一個if-loop,就像我爲了輕鬆操作而編寫的那樣。另外,我在每個大陸都有許多國家。如果我這樣做,我將不得不跟蹤在這個大陸的每個國家,並且是否有一個錯誤很難確定哪個大陸我錯了。 – Ash

+0

我很感激這個方法,謝謝,但是,我是隻是指出了該方法的實際困難。 – Ash

+0

@Ash - 合併可以處理多個'by ='變量,因此您可以在其中查找包含國家和州的查找表。這種方法仍然完美。 – thelatemail

2

如果你的工作與factor你也可以做一些廢話levels,或levels<-確切地說:

`levels<-`(dat$Country, list(
    `North America` = c("USA","Canada","Mexico"), 
    `Europe`   = c("Spain","France","Germany"), 
    `Asia`   = c("Vietnam","China") 
)) 
#[1] North America Asia   Europe  Europe  Asia   
#Levels: North America Europe Asia 
+0

我不完全明白。我不會創建另一個向量與大洲和dding到另一個數據框。另外,雖然我想使用國家,但我需要根據美國的國家將美國劃分爲北部和南部地區......這是另一列。所以,我可能不得不喜歡一個if-loop,就像我爲了輕鬆操作而編寫的那樣。有關如何糾正你的任何建議? – Ash

+0

@Ash - 好吧,這改變了整個問題。加文的查找表的想法是最好的,如果你正在處理多個變量。很少需要在R中執行if循環,因爲您可以執行像merge或match這樣的操作 – thelatemail