使用向量创建“if else”语句> 1

时间:2017-08-19 11:52:00

标签: r if-statement

我正在尝试使用“tidyverse”软件包组织一些数据。我有一个数据框,其中包含每个国家/地区的“性别不平等”指数得分,其中收集数据的日期标题为列(2000年,2005年,2010年),然后是行中的国家/地区得分。

我需要添加这些分数并将它们除以3,2或不分,具体取决于其中一年的分数是否为0 - 例如,如果我有

 Year     2000    2005   2010
 Norway    0      0.106  0.080

我想添加所有三个(0 + 0.106 + 0.080)并除以2.依此类推所有国家/地区,如果所有年份都有分数则除以3,如果只有一年得分则为零

为此,我构建了if else语句:

 GII_data_FINAL <- if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` != 0 ){GII_data2 %>% 
     mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2)
 } else if (GII_data2$`2000`= 0 & GII_data2$`2005` == 0 & GII_data2$`2010` != 0) {GII_data2 %>% 
     mutate(GII_mean_score = `2000`+ `2005`+ `2010`)
 } else if (GII_data2$`2000`== 0 & GII_data2$`2005` != 0 & GII_data2$`2010` == 0) {GII_data2 %>% 
     mutate(GII_mean_score = `2000`+ `2005`+ `2010`)
 } else if (GII_data2$`2000`!= 0 & GII_data2$`2005`!= 0 & GII_data2$`2010` != 0) {GII_data2 %>% 
     mutate (GII_mean_score = (`2000`+ `2005`+ `2010`)/3)
 } else if (GII_data$`2000`!= 0 & GII_data$`2005` == 0 & GII_data$`2010` != 0) {GII_data2 %>% 
     mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2)
 } else if (GII_data$`2000`!= 0 & GII_data$`2005` == 0 & GII_data$`2010` == 0) { GII_data2 %>% 
     mutate(GII_mean_score = `2000`+ `2005`+ `2010`)
 } else if (GII_data$`2000`!= 0 & GII_data$`2005` != 0 & GII_data$`2010` == 0) {GII_data2 %>% 
     mutate(GII_mean_score = (`2000`+ `2005`+ `2010`)/2)
 } else if (GII_data2$`2000` == 0 & GII_data2$`2005` == 0 & GII_data2$`2010` == 0) {GII_data2 %>% 
     mutate(GII_mean_score = `2000`+ `2005`+ `2010`)
 }

但是我得到了声明

"Warning messages:
1: In if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` !=  :
  the condition has length > 1 and only the first element will be used
2: In if (GII_data2$`2000` & GII_data2$`2005` == 0 & GII_data2$`2010` !=  :
  the condition has length > 1 and only the first element will be used
3: In if (GII_data2$`2000` == 0 & GII_data2$`2005` != 0 & GII_data2$`2010` ==  :
  the condition has length > 1 and only the first element will be used
4: In if (GII_data2$`2000` != 0 & GII_data2$`2005` != 0 & GII_data2$`2010` !=  :
  the condition has length > 1 and only the first element will be used"

我已经研究过了,我理解为什么会得到这个陈述,但是我不知道如何让R做我想做的事,因为ifelse不适用于有几个条件(据我所知) )。

我会感激任何帮助!

3 个答案:

答案 0 :(得分:0)

意识到R爱好者会讨厌它,为什么你不只是循环遍历行?

for (row in 1:nrow(your_dataframe)) {
    n_entries = 0
    sum = 0
    for (col in 1:ncol(your_dataframe) {
        if (your_dataframe[row,col] != 0) {
            n_entries = n_entries + 1
            sum = sum + your_dataframe[row,col]
        }
    }
    result = NULL
    if (n_entries > 0) { result = sum / n_entries }
    else {
         result = NA
    }
    # Do something with the result
}

你应该把它包装成函数,理想情况下我会使用apply功能。我的解决方案可能会让您更全面地了解如何执行此操作(也可以使用其他语言)。

答案 1 :(得分:0)

多行(带

  

否则如果

在你的情况下)通常是写一个函数的提示。实际上,您想计算平均值但排除零。你可以定义:

  

average_exclude_0 = function(x){mean(x [x!= 0])}

然后您可以将此功能应用于相应的列,例如使用 mutate_at

编辑:无法添加评论,但我认为Henrik的建议是最好的方法:它快速且方法上正确,因为零实际上是NAs

答案 2 :(得分:0)

我建议写一个函数来计算平均值,不包括零:

  

mean_excluding_0 = function(x){mean(x [x!= 0])}

然后您可以使用 mutate_at 将此函数应用于相应的列。