首页 > 解决方案 > 为什么我的嵌套 ifelse 在函数外部工作,但不在内部(在 R 中)?

问题描述

我正在使用一个数据框,其中一列显示人们的体重指数(BMI),我想创建一个函数来获取这些 BMI 并返回一列解释这些 BMI(体重不足/正常/等) )。

我的函数需要三个参数:dataframe_name、age 和 BMI。(年龄,因为解释因儿童而异)。

所以我尝试ifelse()在我的函数中使用嵌套,并且该函数返回一个列,该列在我的第一个中仅显示条件的 TRUE 参数ifelse();其他人看起来像NA。但是当我直接对我的数据框执行相同的代码时,它可以工作!请帮忙!我不知道我没看到什么...

这是我的函数(imc 代表法语中的 BMI),它在我的表中的应用

        my_function = function(tableau, age, imc){

        stopifnot(age %in% colnames(tableau), imc %in% colnames(tableau))
        stopifnot(is.numeric(tableau[, age]), is.numeric(tableau[, imc]))

        interp = ifelse(tableau$age <= 18, "pas applicable pour enfant", 
                 ifelse(tableau$imc < 16.5, "dénutrition", 
                 ifelse(tableau$imc >= 16.5 & tableau$imc < 18.5, "maigreur",
                 ifelse(tableau$imc >= 18.5 & tableau$imc < 25, "corpulance normale",
                 ifelse(tableau$imc >= 25 & tableau$imc < 30, "surpoids",
                 ifelse(tableau$imc >= 30 & tableau$imc < 35, "obésité modérée",
                 ifelse(tableau$imc >= 35 & tableau$imc < 40, "obésité sévère",
                 ifelse(tableau$imc >= 40, "obésité morbide", "PA")))))))) 
        tableau = cbind(tableau, interpIMC_A = c(interp))
        }
        tab_preuve = my_function(tab_preuve, "age", "IMC")

这就是我在没有函数的情况下做到的(它可以工作,但它不在函数内部)

        interp = ifelse(tab_preuve$age <= 18, "pas applicable pour enfant", 
                 ifelse(tab_preuve$IMC < 16.5, "dénutrition", 
                 ifelse(tab_preuve$IMC >= 16.5 & tab_preuve$IMC < 18.5, "maigreur",
                 ifelse(tab_preuve$IMC >= 18.5 & tab_preuve$IMC < 25, "corpulance normale",
                 ifelse(tab_preuve$IMC >= 25 & tab_preuve$IMC < 30, "surpoids",
                 ifelse(tab_preuve$IMC >= 30 & tab_preuve$IMC < 35, "obésité modérée",
                 ifelse(tab_preuve$IMC >= 35 & tab_preuve$IMC < 40, "obésité sévère",
                 ifelse(tab_preuve$IMC >= 40, "obésité morbide", "PA")))))))) 
        tab_preuve = cbind(tab_preuve, IntIMC = c(interp))

这是没有函数和有函数的结果表

感谢所有想帮助我的人(这让我发疯!) PS:对不起我的英语和长篇文章,我希望它很清楚。

标签: rfunctionif-statement

解决方案


您能否发布数据的代表,以便更容易找出问题所在?

一般来说,我建议使用包中的case_when()函数(https://dplyr.tidyverse.org/reference/case_when.htmldplyr。它是if语句的矢量化版本,并且更易于使用,因为它是扁平的且没有嵌套,因此更容易发现错误和语法错误。

此外,如果您正在修改数据框,您可以在mutate()函数中使用它以使代码更具可读性。

例如:

tableau %>% 
   mutate(imc = case_when(
                  imc < 16.5 ~ "dénutrition",
                  imc >= 1.6 & imc < 18.5 ~ "maigreur",
                  etc...)```



推荐阅读