r - 为什么我的嵌套 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:对不起我的英语和长篇文章,我希望它很清楚。
解决方案
您能否发布数据的代表,以便更容易找出问题所在?
一般来说,我建议使用包中的case_when()
函数(https://dplyr.tidyverse.org/reference/case_when.html)dplyr
。它是if
语句的矢量化版本,并且更易于使用,因为它是扁平的且没有嵌套,因此更容易发现错误和语法错误。
此外,如果您正在修改数据框,您可以在mutate()
函数中使用它以使代码更具可读性。
例如:
tableau %>%
mutate(imc = case_when(
imc < 16.5 ~ "dénutrition",
imc >= 1.6 & imc < 18.5 ~ "maigreur",
etc...)```
推荐阅读
- asp.net - 用于连接 SQL Server 并以 JSON 格式返回响应的 Web API
- bash - 一行中的多个 awks
- arrays - 使用多字符分隔符将字符串拆分为数组
- r - 在 r 中的值内过滤 n char
- node.js - apollo-angular error // 角度项目无法编译
- php - 在php中的提交按钮后打印账单发票
- python - 用一个字典/多个字典创建一个类
- vue.js - VUE 使用 axios- 从服务器接收但未显示的数据
- css - 闪亮的模态:宽度自动调整到里面的内容
- python - Python可以使用不同的格式化程序将日志记录到同一个文件中吗