2017-03-09 198 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