列运算_数据运算029篇对多列数据框进行格式转换

本文以R语言为例,介绍了将数据框中非数值型列转换为数值型的操作。先生成虚拟数据,阐述操作思路,包括判断列类型、确定需转换的列,对因子型列先转字符再转数值,最后同步转换。还提及大量列转换及缺失值情况需综合考虑,可参考dplyr包mutate系列用法。
 快速对列进行数值的转换生活科学哥-R语言科学 2020-10-30  22:23今天来分享R网友想解决一个例子,我把它进一步复杂化,与各位一起探讨,如何对于数据框中的多列进行文本型向数字型的转换;可能会有朋友说,我直接as.numberic不就行了嘛 ?设想一个具有100列的数据框,怎么办?

原始的数据

  为了演示这个过程,我这里生成了一个虚拟的数据,结构如下:

library(magrittr)library(dplyr)library(stringr)dfc(df$eas.character(df$e)df$aas.character(df$a)> df     a b c    d e1  0.3 3 a -0.5 A2 -0.5 5 b  0.8 B3  2.4 4 c    2 C> str(df)'data.frame':  3 obs. of  5 variables: $ a: chr  "0.3" "-0.5" "2.4" $ b: num  3 5 4 $ c: Factor w/ 3 levels "a","b","c": 1 2 3 $ d: Factor w/ 3 levels "-0.5","0.8","2": 1 2 3 $ e: chr  "A" "B" "C"

可以看到, 在该数据中,我们生成了一个数据框,共有5列,并且是不同的格式。我们想实现的目的,就是将这些列,如果实际上是为数字的,转成数值型。在这个例子中,列a,b,d,原本应该有的归属,就是数值型;在转化的过程中,我们不用df$a

7391f672de71424934f30c49cc62475d.png

操作的思路与实现方式

    整个的思路分三部分:

  • 先看列中是不是已经有类型为数值型的列,如果是,就不用进行转化,如果不是,就要进行处理

  • 接下来,把这些非数值型的列,分别进行判断,看看该列是不是应该属于数值,而数值,可以包含小数点,负号这两种常规符号,以及其它的0-9的数字,如果列中的所有元素满足这个要求,那就应该进行转化成数值的操作,通过该判断,来决定要转化的列;在这些列当中,考虑到非数值型的类型,还有可能是因子型,对于因子型的内容,比如说这里的d列,直接as.numberic肯定是不行的(看下面的区别),所以,保险起见,要先转化为character,再转成数值。

  • 将这些要转换的列,进行直接的同步转换

#这是一个判断向量是不是非数值型,这里单独把取反写成一个函数的原因在于方便使用sapply#如果向量为非数值型,返回TRUEnotfunction(s){  return(!is.numeric(s))  }#这是对列进行预处理,把负号与.这两个数值含有的符号先除去,然后再判断有没有出现除0-9之外的符号#如果某列有任何的非数字(除点与负号之外),则返回FALSE(表示该列不需要转化)judfunction(k){  k"\\.")  k"\\-")  !any(grepl("\\D",k))}#将非数值型的列,先转化成字符串(防止因子型as.numberic出错)df%mutate_if(not,as.character)#直接用sapply,进行本应该是数值型的列进行as.numeric的操作(操作前df%mutate_at(colnames(df)[sapply(.,jud)],as.numeric)

最终结果可以看到,已经把a,d列进行了转换。

> df     a b c    d e1  0.3 3 a -0.5 A2 -0.5 5 b  0.8 B3  2.4 4 c  2.0 C> str(df)'data.frame':  3 obs. of  5 variables: $ a: num  0.3 -0.5 2.4 $ b: num  3 5 4 $ c: chr  "a" "b" "c" $ d: num  -0.5 0.8 2 $ e: chr  "A" "B" "C"
7391f672de71424934f30c49cc62475d.png

结语

   上面的例子中只是举了个简单的例子,在对于大量列的情况下转化成数值,可能 有所帮助。当然了,如果有一些缺失值的情况,也得综合加以考虑。

   今天的简单分享就到这里,希望有用;另外对于dplyr包中的mutate系列的用法,可以参考一下,有些可以比较方便。

参考文献 

1.  https://community.rstudio.com/t/dplyr-mutate-at-with-tidyeval/20562

af3ac7278e754b5aaea36711d537b8dc.gif

往期回顾

61c9ef0fd9d89f2cf6ebcb6bcf3c5522.gif

01

基本概念

从零开始学R-001篇-程序安装

从零开始学R-002篇-向量

从零开始学R-003篇-数据框

从零开始学R-004篇-列表

从零开始学R-005篇-矩阵

数据结构-006篇-数组实例

数据结构-007篇-因子

 数据运算-008篇-数学与逻辑运算

数据运算-009篇-矩阵运算简单介绍

数据运算-010篇-内置的一般数学计算函数

数据运算-011篇-内置的统计概率函数

数据运算-012篇-集合的操作

逻辑运算-013篇-条件语句

循环语句-014篇-for与while

循环语句-015篇-apply家族

定位函数-016篇-which函数打天下

字符处理-017篇-paste函数

字符处理-018篇-grep,substr,sub等函数

数据运算-019篇-统计函数初体验median与mad

数据运算-020篇-统计函数初体验之分位数quantile

数据运算-021篇-统计函数初体验之差分diff函数

数据运算-022篇-统计函数初体验之中心化函数scale

数据运算-023篇-描述性统计分析及缺失值分析

数据运算-024篇-相关系数分析

数据运算-025篇-dplyr之slice

数据运算-026篇-数据的行拆分

数据运算-027篇-数据的行合并

数据运算-028篇-rlang的列引用方法

6adfe09cd082122b716af2467b701902.gif

02

基础作图

R的作图-001篇-barplot柱状图

R的作图-002篇-pie 作饼图

R的作图-003篇-hist 直方图

R的作图-004篇-boxplot箱线图

R的作图-005篇-核密度图与比较

R的作图-006篇-plot函数

R的作图-007篇-散点图与线性拟合

R的作图-008篇-散点图矩阵

R的作图-009篇-高密度散点图

R的作图-010篇-三维散点图

R的作图-011篇-气泡图

R的作图-012篇-马赛克图

R的作图-013篇-QQ图及原理

R的作图-014篇-lm拟合结果图解释

R的作图-015篇-ggplot2之初体验

R的作图-016篇-ggplot2之geom_point

R的作图-017篇-ggplot2之geom_jitter与rug

R的作图-018篇-ggplot2之geom_line与geom_path

R的作图-019篇-ggplot2之geom_area,geom_polygon geom_ribbon

R的作图-020篇-ggplot2之geom_bar,geom_col与geom_histogram    

R的作图-021篇-ggplot2之geom_density

R的作图-022篇-ggplot2之geom_density2d

R的作图-023篇-ggplot2之geom_boxplot

R的作图-024篇-ggplot2之geom_bin2d

R的作图-025篇-ggplot2之geom_contour()

R的作图-026篇-ggplot2之geom_crossbar 与geom_count()

R的作图-027篇-ggplot2之geom_errorbar 与geom_linerange等简单作图

R的作图-028篇-ggplot2之geom_vline/hline/abline/smooth等

R的作图-029篇-ggplot2之geom_tile,geom_rect与geom_raster

R的作图-030篇-ggplot2之geom_text与geom_label

作图进阶-031篇-ggplot2之geom_violin

作图进阶-032篇-ggplot2之分面facet_grid与facet_wrap

作图进阶-033篇-ggplot2之legend

作图进阶-034篇-ggplot2之作图区的设定

作图进阶-035篇-ggalluvial之桑基图

作图进阶-036篇-ggridges之峰峦图

作图进阶-037篇-坐标轴标签重叠的优化

作图进阶-038篇-数据拟合作图分析

作图进阶-039篇-plotly包之add_XXX

作图进阶-040篇-plotly的type与mode

作图进阶-041篇-plotly的颜色设置

作图进阶-042篇-plotly中往图中增加标签

作图进阶-043篇-plotly通过add_fun灵活叠加图

作图进阶-044篇-plotly的图例legend设置

作图进阶-045篇-plotly的坐标轴Ticks设置

作图进阶-046篇-plotly设定默认的trace颜色

作图进阶-047篇-plotly中画误差棒作图进阶-048篇-plotly中的箱线图

作图进阶-049篇-plotly中的动画效果

作图进阶-050篇-plotly中二维密度与等高线

作图进阶-051篇-add_heatmap的使用

作图进阶-052篇-add_ribbons与polygons的使用

作图进阶-053篇-add_segments,add_paths与add_table

作图进阶-054篇-基于矩阵画热图

作图进阶-055篇-mesh3d画个雨伞玩玩

作图进阶-056篇-经验累积分布函数的实现

作图进阶-057篇-画个瓶子玩玩

 作图进阶-058篇-plotly中的曲线旋转

作图进阶-059篇-曲线旋转后简单构造三维图形 作图进阶-060篇-曲线的拉伸作图进阶-061篇-ggplot2中的legend排列作图进阶-062篇-ggplot2中采用双标度作图进阶-063篇-ggplot2中的标度作图进阶-064篇-plotly里的gauge chart作图进阶-065篇-plotly里的瀑布图作图进阶-066篇-plotly里的漏斗图作图进阶-067篇-ggplot2中标注显著性作图进阶-068篇-ggplot2中的嵌套子图作图进阶-069篇-r中的数据表格处理作图进阶-070篇-再谈R中的颜色作图进阶-071篇-再谈R中的因子作图进阶-072篇-展现交集的韦恩图作图进阶-073篇-用R快速生成word文档批6adfe09cd082122b716af2467b701902.gif

03

作图技巧

作图技巧-001篇-facet_zoom放大局部图

作图技巧-002篇-ggplot2 中的字体设置

作图技巧-003篇-ggplot2 新版本 3.3.0的一些新功能

作图技巧-004篇-QQ图之DIY

作图技巧-005篇-plotly做3维曲面图

作图技巧-006篇-数据标记初体验

作图技巧-007篇-数据标记之geom_mark_hull进阶

作图技巧-008篇-ggforce中甜甜圈饼图的作法及其它的功能

作图技巧-009篇-ggplot作图时的因子排序

作图技巧-010篇-plot_ly中的mesh3d

作图技巧-011篇-ggplot_build中的数据提取实现histogram与density同步叠加

作图技巧-012篇-ggplot中的stat_sum等系列

作图技巧-013篇-ggplot分面图的标签设置

作图技巧-014篇-不同的样条曲线bspline

作图技巧-015篇-大家一起来拼图

作图技巧-016篇-拼图系列之2-cowplot

作图技巧-017篇-拼图工具之3-patchwork

作图技巧-018篇-第二坐标轴在ggplot2中的实现

作图技巧-019篇-draw_key_XXX系列

作图技巧-020篇-更改ggplot2作图的默认设置

作图技巧-021篇-增加基于表达式的坐标轴标题

6adfe09cd082122b716af2467b701902.gif

04

R的技巧

R的技巧-001篇-快速从列表中提取元素组成数据框

R的技巧-002篇-快速对数据框中满足条件的列进行替换

R的技巧-003篇-数字的不同取整与进位

R的技巧-004篇-文件名提取分类成表

R的技巧-005篇-直方图与分布图的叠加

R的技巧-006篇-ggplot2中的cut类函数

R的技巧-007篇-assign与get:动态生成变量与获取变量

R的技巧-008篇-pretty函数实现完美分割点

R的技巧-009篇-数据填充                 

R的技巧-010篇-dplyr之slice,mutate,summarize  与do

R的技巧-011篇-dnorm,pnorm与qnorm傻傻分不清

R的技巧-012篇-缝缝补补改创建好的ggplot2图

R的技巧-013篇-approx函数插值

R的技巧-014篇-openxls包处理excel数据

b259494ddd0b343d65d1534274981a54.png 

欢迎关注与转发,如有不懂,可以共同探讨,在后台留言或者是扫码下方。

f779373e1d6e7298a6650ac49762ba54.png

你点的每一个在看,我都认真当成了喜欢

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值