如何用dplyr的mutate_if对数值列保留一位小数并排除指定列?
解决方案
你可以通过自定义mutate_if的判断条件,同时筛选数值列并排除指定列,无需手动枚举所有列,同时保留非数值列。另外需要注意:你提到的「向下取整保留一位小数」和原代码里的round(四舍五入)逻辑不同,以下分两种情况给出实现:
1. 向下取整保留一位小数(符合你描述的需求)
mtcars %>% mutate_if(~is.numeric(.) && !cur_column() %in% "drat", ~floor(. * 10) / 10)
- 逻辑说明:
~is.numeric(.) && !cur_column() %in% "drat":作为列筛选条件,只处理数值型且列名不是drat的列floor(. * 10) / 10:先将数值放大10倍,用floor向下取整后再缩小10倍,实现保留一位小数的向下取整效果
2. 四舍五入保留一位小数(修正你原代码的列排除逻辑)
如果你实际需要的是四舍五入(和原代码逻辑一致),可以用:
mtcars %>% mutate_if(~is.numeric(.) && !cur_column() %in% "drat", round, digits = 1)
扩展:排除多个列
如果需要排除多列,只需将"drat"换成列名向量即可,例如排除drat和wt列:
mtcars %>% mutate_if(~is.numeric(.) && !cur_column() %in% c("drat", "wt"), ~floor(. * 10) / 10)
内容的提问来源于stack exchange,提问作者Gopala
相关产品推荐
相关产品推荐

