R语言如何简便筛选任意food列匹配指定碳水食物的行?
实现方法
完全可以用函数式写法简化逻辑,这里给两种适配你现有代码风格的常用实现,均基于tidyverse生态:
方法1:使用dplyr内置的if_any(最推荐)
if_any是dplyr 1.0.0之后推出的行方向判断函数,专门解决「任意一列满足条件就保留」的场景,无需额外自定义函数:
# 先定义预碳水食物列表 carb_foods <- c("bread", "rice", "potatoes", "cake", "dough") # 一行完成筛选,自动匹配所有food前缀列和预定义列表 carb.df <- df %>% filter(if_any(starts_with("food."), ~ .x %in% carb_foods))
参数说明:
- 第一个参数
starts_with("food."):自动选中所有列名以food.开头的列,后续如果新增food.11等列也不需要修改逻辑 - 第二个参数
~ .x %in% carb_foods:对选中的每一列,判断值是否在碳水列表中,只要任意一列满足条件就会被筛选保留
方法2:自定义函数实现(满足你要求的function类方法)
如果需要把判断逻辑封装成独立函数复用,可以自定义判断规则后结合rowwise + c_across使用:
# 预定义碳水列表 carb_foods <- c("bread", "rice", "potatoes", "cake", "dough") # 自定义判断函数:输入一行的food列值,返回是否存在匹配的碳水食物 has_carb <- function(food_values) { any(food_values %in% carb_foods) } # 筛选调用 carb.df <- df %>% rowwise() %>% filter(has_carb(c_across(starts_with("food.")))) %>% ungroup() # 用完rowwise建议取消行分组,避免后续操作出问题
两种方法的运行结果和你原来写的冗长判断逻辑完全一致,后续如果要调整匹配的食物列表、或者调整要判断的列,只需要修改对应参数即可,不需要重复书写判断条件。
内容的提问来源于stack exchange,提问作者ed.code.explorer
相关产品推荐
相关产品推荐

