我正在尝试使用“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不适用于有几个条件(据我所知) )。
我会感激任何帮助!
答案 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 将此函数应用于相应的列。