r - R中避免嵌套ifelse语句的方法

标签 r tidyverse

我有一个数据框,其中包含各种年龄和每个年龄的值。我想将不同的年龄分为更广泛的年龄组。为此,我必须创建一个相当复杂的嵌套 ifelse 语句:

library(tidyverse)

df <- data.frame(age = c("15 to 17", "18 and 19", "20 to 24", "25 to 29", "30 to 34", "35 to 39", "40 to 44", "45 to 49", "50 to 54", "55 to 59"),
                 value = sample(1000:2000,10, replace=TRUE))

new_df = df %>% 
  mutate(age_band = 
           ifelse(age %in% c("15 to 17","18 and 19"), '15 to 19', ifelse(age %in% c("20 to 24","25 to 29"), '20s', ifelse(age %in% c("30 to 34","35 to 39"), '30s','40+'))))

有没有办法在不使用如此复杂的嵌套语句的情况下做到这一点?数据一直覆盖到 85 岁及以上,对每个不同年龄组进行分类变得非常复杂。

最佳答案

遵循 @Claudiu Papasteri 的建议:

套餐

library(dplyr)

解决方案

df %>% 
  mutate(age_band = case_when( age %in% c("15 to 17","18 and 19") ~  '15 to 19',
                               age %in% c("20 to 24","25 to 29") ~ '20s',
                               age %in% c("30 to 34","35 to 39") ~ '30s',
                               TRUE ~'40+')
         )

ps:我会在 case_when 中包含所有特定语句,甚至是“40+”的最后一个语句,这样您就可以跟踪数据集中的任何问题。因为如果缺少某些内容,或者输入错误,其他所有内容都会被编码为“40+”。因此,通过陈述每种情况,您可以在运行分析或生成图表之前发现问题并修复所有问题。最后一条语句可以更改为TRUE ~age。这意味着,无论剩下什么,都使用相同的值,或 TRUE ~ NA,您可以重新编码剩余的内容以防止丢失。所以你知道所有缺失都意味着你有一个必须解决的问题。

输出

         age value age_band
1   15 to 17  1432 15 to 19
2  18 and 19  1112 15 to 19
3   20 to 24  1265      20s
4   25 to 29  1076      20s
5   30 to 34  1212      30s
6   35 to 39  1238      30s
7   40 to 44  1384      40+
8   45 to 49  1612      40+
9   50 to 54  1606      40+
10  55 to 59  1897      40+

关于r - R中避免嵌套ifelse语句的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71082492/

相关文章:

c++ - 如何使用 Rcpp 将映射<double,T> 从 C++ 传递到 R

r - Shiny :将数据集中选定的列绘制到图表中

r - Tidyverse 可能存在也可能不存在的列的按行求和

r - split_wider 其中前半部分成为列名称,后半部分成为单元格值

r - 如何在函数内的 dplyr 过滤器中使用动态参数

css - R Shiny - 修复了 Shiny 仪表板中的侧边栏和主标题

R传单easybutton : reset view to layer bbox

r - 分配给 is.na(clinical.trial$age)

r - 自定义列名称作为稳定性 R 包函数中的参数

r - 以不同的单位扩展时间序列