这是刚刚探索出来的一个小技巧,在这里记录一下!

对于个别变量的类型转换,例如从其他类型转化为因子变量,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类型,也就达到了批量转换变量类型的目的了。如果有其他类似的需求,对自定义函数进行对应的修改就可以了。

技巧 | 如何批量地将整型变量转换为因子变量相关推荐

  1. 整型变量转换为字符串变量(myitoa)

    将整型变量转换为字符串变量 最近刷编程题,总是有统计数字类型的题目.于是想出将整型转换为字符串,再逐一寻找的暴力做法,但怎样将整型变量转换为字符串变量呢,C中头文件里有atoi现成的函数可以使用,倔强 ...

  2. python中factor函数_左手用R右手Python系列——因子变量与分类重编码

    原标题:左手用R右手Python系列--因子变量与分类重编码 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业 ...

  3. python 变量 r_左手用R右手Python系列——因子变量与分类重编码

    今天这篇介绍数据类型中因子变量的运用在R语言和Python中的实现. 因子变量是数据结构中用于描述分类事物的一类重要变量.其在现实生活中对应着大量具有实际意义的分类事物. 比如年龄段.性别.职位.爱好 ...

  4. Excel实用技巧-如何批量提取excel工作表名称

    Excel实用技巧-如何批量提取excel工作表名称 1. 打开Excel文件,点击"公式"栏,进而点击"定义管理器" 2. 在弹出的对话框中,点击新增按钮, ...

  5. 快速批量微信dat格式转换为jpg

    上一次我们讲了如何添加微信dat转换jpg等图片格式.但不少用户反应操作太麻烦,还不支持文件夹.今天我们就给大家介绍一个更方便的方式.不知道dat文件怎么找的朋友,可以看看之前的这篇文章哦: 微信da ...

  6. 【Excel】偷懒小技巧3:金额小写自动转换为大写

    1 背景 看造价文件,突然发现了这么个东东. 点击进去一看,果然是编辑好公式可以自动生成那种.发现了新东东,大喜过望,原来还可以这样. 仔细看了下公式,嵌套又嵌套,好像有点明白,又好像晕乎乎.还是自己 ...

  7. 如何批量将 gif 图片转换为 jpg 格式

    概要:gif 格式的图片相信大家或多或少的都有接触过.最常见的就是我们的表情包.动图等等,这也是 gif 格式图片比较大的应用场景.但也并不一定是所有的 gif 格式的图片都是动图,也有些是静态的.那 ...

  8. 计算机删除文档中所有的空行,Word查找技巧:批量删除文档中空格、空行

    原标题:Word查找技巧:批量删除文档中空格.空行 在日常工作中我们经常会碰到以下2个困扰: 如,很多网上下载或拷贝到Word的纯文本形式的资料,最烦的莫过于文档中有一大堆空格或空行(回车符),格式非 ...

  9. Excel怎么批量将CSV格式转换为xlsx或xls格式?VBA、宏、软件?

    怎么批量将CSV格式转换为xlsx或xls格式? 下面给大家介绍几种方法: 1.原始方法 如果是少量的Excel文件可以采用打开--另存为..,选择想要转换的格式就OK了! 2.利用Excel的VBA ...

最新文章

  1. 一文总结微软研究院Transformer霸榜模型三部曲!
  2. mac book file management system
  3. springboot(2.2.4)的默认日志框架logback换成log4j2
  4. 深入理解DPDK架构|经典PDF分享
  5. 实现div里的img图片水平垂直居中
  6. ASP.Net Core Razor 页面路由
  7. [渝粤教育] 新乡医学院 医学免疫学 参考 资料
  8. Ubuntu系统---WeChat安装
  9. 统计整数的各位数字和
  10. RedisTemplate 常用方法、序列化方式、基于 Redis 实现分布式锁
  11. microhard p900数传配置方法
  12. Flume+Kafka+Storm+Redis流计算实现wordcount示例
  13. 计算机科学与技术论文选题怎么选,比较好写的计算机科学与技术专业论文选题 计算机科学与技术专业论文题目如何取...
  14. 后台导出打开Excle提示:Excel无法打开文件因为文件或文件扩展名无效
  15. CameraX Java 1.0.0-alpha10 安卓开发
  16. 2023最新springboot计算机毕业设计选题大全(附源码+论文答辩),别再发愁毕设了。
  17. 网站导航怎么设置利于网站SEO优化
  18. QT调用IE浏览器COM插件完成网页浏览
  19. 小四轴实验:空心杯电机驱动
  20. Vue中,有哪些烂熟于心的知识

热门文章

  1. esxi存储(外部共享存储)- Open FIle
  2. Mysql学习总结(32)——MySQL分页技术详解
  3. python查找文件名_Python实现的根据文件名查找数据文件功能示例
  4. BIO、NIO、AIO入门认识
  5. 我要做 Android 之 ContentProvider
  6. 实时导出正在运行的虚拟机或检查点
  7. Eclipse中 Project facet jst.web.jstl has not been defined.解决方案
  8. win下 git gui 使用教程
  9. AD域环境的搭建 基于Server 2008 R2
  10. 书评 – 程序员经典读物(2)