技巧 | 如何批量地将整型变量转换为因子变量
这是刚刚探索出来的一个小技巧,在这里记录一下!
对于个别变量的类型转换,例如从其他类型转化为因子变量,base
包中的transform()
函数或者dplyr
包中的mutate()
函数就可以快速完成:
library(tidyverse)
dta <- mtcars# transform函数
dta %>%transform(cyl = factor(cyl),hp = factor(hp)) %>%as_tibble()# mutate函数
dta %>%mutate(cyl = factor(cyl),hp = factor(hp)) %>%as_tibble()
可以看出两个函数在管道操作符中的使用方式还是比较相似的,都是将所有需要转换的变量依次写入即可。
但是,当需要转换类型的变量比较多时,这种挨个写入变量名的方式就很不适用了。这里就需要使用dplyr
包中的辅助函数across()
了。
across()
函数功能之一就是选择(select)指定变量名或符合约束条件的变量名,然后对这些变量进行函数运算,语法结构如下:
across(.cols = everything(), .fns = NULL, ..., .names = NULL)
上面.cols
就是选择出的变量,.fns
是应用于这些变量的函数。先列举几个常与它连用的辅助函数:
everyyhing()
:选择所有变量;starts_with()
:选择变量名以特定字符开始的变量;ends_with()
:选择变量名以特定字符结束的变量名。
上面的这些函数都来自于dplyr
包,这里先不做详细介绍,后面会有推文总结dplyr
中所有的辅助函数。另外关于dplyr
包中“选择(select)”的含义前面推文已有介绍(dplyr | 数据导入和预处理的常用函数)。
为了批量地将一个数据框中所有的整型变量都转换为因子,第一步是要选择出所有整型变量。
首先想到判断整型变量的函数应该是is.integer()
,但是在实操中发现,数据框的整型变量大多是以double(双精度)类型存在的,使用is.integer
不会选择出任何变量,也就达不到目的;而由于double类型也包括小数,所以使用is.double
会选择出多余的变量,同样达不到目的。对比结果如下:
dta %>%mutate(across(where(is.integer), factor)) %>%as_tibble()dta %>%mutate(across(where(is.double), factor)) %>%as_tibble()
# 输出结果
> dta %>%
+ mutate(across(where(is.integer), factor)) %>%
+ as_tibble()
# A tibble: 32 x 11mpg cyl disp hp drat wt qsec vs am gear carb<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>1 21 6 160 110 3.9 2.62 16.5 0 1 4 42 21 6 160 110 3.9 2.88 17.0 0 1 4 43 22.8 4 108 93 3.85 2.32 18.6 1 1 4 14 21.4 6 258 110 3.08 3.22 19.4 1 0 3 15 18.7 8 360 175 3.15 3.44 17.0 0 0 3 26 18.1 6 225 105 2.76 3.46 20.2 1 0 3 17 14.3 8 360 245 3.21 3.57 15.8 0 0 3 48 24.4 4 147. 62 3.69 3.19 20 1 0 4 29 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# ... with 22 more rows> dta %>%
+ mutate(across(where(is.double), factor)) %>%
+ as_tibble()
# A tibble: 32 x 11mpg cyl disp hp drat wt qsec vs am gear carb <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct>1 21 6 160 110 3.9 2.62 16.46 0 1 4 4 2 21 6 160 110 3.9 2.875 17.02 0 1 4 4 3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 5 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2 6 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1 7 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4 8 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2 9 22.8 4 140.8 95 3.92 3.15 22.9 1 0 4 2
10 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4
# ... with 22 more rows
可以看出,使用is.integer
没有任何变量被转化为factor类型,说明across()
中没有被添加任何变量名;而使用is.double
所有的变量都会被转化为factor类型。
由于上面两个函数都达不到目标,可以考虑从整数的特点出发,即整数除以1后的余数为0。R语言中的取余函数为%%
,基于此,可以自定义一个“选择”函数:
function(x) all(x %% 1 == 0)
all()
函数来自基础包base
,如果函数内的判断条件成立会返回TRUE,否则返回FALSE。
把自定义函数应用到across()
中:
dta %>%mutate(across(function(col) all(col %% 1==0), factor)) %>%as_tibble()
# 输出结果
> dta %>%
+ mutate(across(function(col) all(col %% 1==0), factor)) %>%
+ as_tibble()
# A tibble: 32 x 11mpg cyl disp hp drat wt qsec vs am gear carb <dbl> <fct> <dbl> <fct> <dbl> <dbl> <dbl> <fct> <fct> <fct> <fct>1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
# ... with 22 more rows
可以看出,数据框中所有的整型变量都已经被转化为factor类型了,而非整型变量依然是原本的double类型,也就达到了批量转换变量类型的目的了。如果有其他类似的需求,对自定义函数进行对应的修改就可以了。
技巧 | 如何批量地将整型变量转换为因子变量相关推荐
- 整型变量转换为字符串变量(myitoa)
将整型变量转换为字符串变量 最近刷编程题,总是有统计数字类型的题目.于是想出将整型转换为字符串,再逐一寻找的暴力做法,但怎样将整型变量转换为字符串变量呢,C中头文件里有atoi现成的函数可以使用,倔强 ...
- python中factor函数_左手用R右手Python系列——因子变量与分类重编码
原标题:左手用R右手Python系列--因子变量与分类重编码 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业 ...
- python 变量 r_左手用R右手Python系列——因子变量与分类重编码
今天这篇介绍数据类型中因子变量的运用在R语言和Python中的实现. 因子变量是数据结构中用于描述分类事物的一类重要变量.其在现实生活中对应着大量具有实际意义的分类事物. 比如年龄段.性别.职位.爱好 ...
- Excel实用技巧-如何批量提取excel工作表名称
Excel实用技巧-如何批量提取excel工作表名称 1. 打开Excel文件,点击"公式"栏,进而点击"定义管理器" 2. 在弹出的对话框中,点击新增按钮, ...
- 快速批量微信dat格式转换为jpg
上一次我们讲了如何添加微信dat转换jpg等图片格式.但不少用户反应操作太麻烦,还不支持文件夹.今天我们就给大家介绍一个更方便的方式.不知道dat文件怎么找的朋友,可以看看之前的这篇文章哦: 微信da ...
- 【Excel】偷懒小技巧3:金额小写自动转换为大写
1 背景 看造价文件,突然发现了这么个东东. 点击进去一看,果然是编辑好公式可以自动生成那种.发现了新东东,大喜过望,原来还可以这样. 仔细看了下公式,嵌套又嵌套,好像有点明白,又好像晕乎乎.还是自己 ...
- 如何批量将 gif 图片转换为 jpg 格式
概要:gif 格式的图片相信大家或多或少的都有接触过.最常见的就是我们的表情包.动图等等,这也是 gif 格式图片比较大的应用场景.但也并不一定是所有的 gif 格式的图片都是动图,也有些是静态的.那 ...
- 计算机删除文档中所有的空行,Word查找技巧:批量删除文档中空格、空行
原标题:Word查找技巧:批量删除文档中空格.空行 在日常工作中我们经常会碰到以下2个困扰: 如,很多网上下载或拷贝到Word的纯文本形式的资料,最烦的莫过于文档中有一大堆空格或空行(回车符),格式非 ...
- Excel怎么批量将CSV格式转换为xlsx或xls格式?VBA、宏、软件?
怎么批量将CSV格式转换为xlsx或xls格式? 下面给大家介绍几种方法: 1.原始方法 如果是少量的Excel文件可以采用打开--另存为..,选择想要转换的格式就OK了! 2.利用Excel的VBA ...
最新文章
- 一文总结微软研究院Transformer霸榜模型三部曲!
- mac book file management system
- springboot(2.2.4)的默认日志框架logback换成log4j2
- 深入理解DPDK架构|经典PDF分享
- 实现div里的img图片水平垂直居中
- ASP.Net Core Razor 页面路由
- [渝粤教育] 新乡医学院 医学免疫学 参考 资料
- Ubuntu系统---WeChat安装
- 统计整数的各位数字和
- RedisTemplate 常用方法、序列化方式、基于 Redis 实现分布式锁
- microhard p900数传配置方法
- Flume+Kafka+Storm+Redis流计算实现wordcount示例
- 计算机科学与技术论文选题怎么选,比较好写的计算机科学与技术专业论文选题 计算机科学与技术专业论文题目如何取...
- 后台导出打开Excle提示:Excel无法打开文件因为文件或文件扩展名无效
- CameraX Java 1.0.0-alpha10 安卓开发
- 2023最新springboot计算机毕业设计选题大全(附源码+论文答辩),别再发愁毕设了。
- 网站导航怎么设置利于网站SEO优化
- QT调用IE浏览器COM插件完成网页浏览
- 小四轴实验:空心杯电机驱动
- Vue中,有哪些烂熟于心的知识
热门文章
- esxi存储(外部共享存储)- Open FIle
- Mysql学习总结(32)——MySQL分页技术详解
- python查找文件名_Python实现的根据文件名查找数据文件功能示例
- BIO、NIO、AIO入门认识
- 我要做 Android 之 ContentProvider
- 实时导出正在运行的虚拟机或检查点
- Eclipse中 Project facet jst.web.jstl has not been defined.解决方案
- win下 git gui 使用教程
- AD域环境的搭建 基于Server 2008 R2
- 书评 – 程序员经典读物(2)