R语言和Python中如何将分数转换为小数?

简介: R语言和Python中如何将分数转换为小数?

分数转小数算法

最近在处理GO富集数据的时候,遇到一个问题:分数形式(113/4193)无法被系统直接识别为数值,在作图时需要横坐标为GeneRatio数据,因此需要一个能将分数转换为浮点型小数的方法。

今天分享一个函数小技巧,主要是正则表达式和多重比较,在R语言和Python中实现对分数和小数的快速转换,使用效果如下:

mixedToFloat(113/4193)
[[out]]:0.026949678034

实现原理

mixedToFloat <- function(x){
    x <- sapply(x, as.character)
    is.integer  <- grepl("^-?\\d+$", x)
    is.fraction <- grepl("^-?\\d+\\/\\d+$", x)
    is.float <- grepl("^-?\\d+\\.\\d+$", x)
    is.mixed    <- grepl("^-?\\d+ \\d+\\/\\d+$", x)
    stopifnot(all(is.integer | is.fraction | is.float | is.mixed))
    numbers <- strsplit(x, "[ /]")
    ifelse(is.integer,  as.numeric(sapply(numbers, `[`, 1)),
           ifelse(is.float,    as.numeric(sapply(numbers, `[`, 1)),
                  ifelse(is.fraction, as.numeric(sapply(numbers, `[`, 1)) /
                             as.numeric(sapply(numbers, `[`, 2)),
                             as.numeric(sapply(numbers, `[`, 1)) +
                             as.numeric(sapply(numbers, `[`, 2)) /
                             as.numeric(sapply(numbers, `[`, 3)))))
}

上述代码实现了一个函数 mixedToFloat(),用于将表示混合数的字符串转换为浮点型数值。函数的输入参数 x 是待转换的字符串,由一个向量或列表组成。函数的输出结果是一个向量,其中包含将输入向量中的字符串转换成浮点型后得到的数值。

解释说明

  1. x <- sapply(x, as.character) 将输入向量中的所有元素强制转换成字符型,赋值给变量 x
  2. is.integer <- grepl("^-?\\d+$", x) 判断当前元素是否为整型,返回一个逻辑向量,其中为 TRUE 的元素表示相应元素是整型,否则为 FALSE
  3. is.fraction <- grepl("^-?\\d+\\/\\d+$", x) 判断当前元素是否为分数型,返回一个逻辑向量,其中为 TRUE 的元素表示相应元素是分数型,否则为 FALSE
  4. is.float <- grepl("^-?\\d+\\.\\d+$", x) 判断当前元素是否为浮点型,返回一个逻辑向量,其中为 TRUE 的元素表示相应元素是浮点型,否则为 FALSE
  5. is.mixed <- grepl("^-?\\d+ \\d+\\/\\d+$", x) 判断当前元素是否为混合型,返回一个逻辑向量,其中为 TRUE 的元素表示相应元素是混合型,否则为 FALSE
  6. stopifnot(all(is.integer | is.fraction | is.float | is.mixed))) 确认所有元素均为整型、分数型、浮点型或混合型。
  7. numbers <- strsplit(x, "[ /]") 将所有字符串按照空格和正斜杠进行分割(即将混合型拆分成整型和分数型),分割后的结果赋值给变量 numbers
  8. 如果元素是整型,将其转换成浮点型;如果是浮点型,直接返回其值;如果是分数型或混合型,进行对应的转换和计算。

Python实现方法

可以使用如下的Python代码实现将分数转换为小数的函数:

def convert_fraction_to_decimal(fraction):
    parts = fraction.split('/')
    numerator = int(parts[0])
    denominator = int(parts[1])
    return numerator / denominator

在该函数中,先将分数字符串按照 / 符号拆分成两个部分,分别代表分子和分母。然后将这两个部分都转换为整数类型,最后使用除法算符 / 得到小数值并返回。

例如,如果需要将分数 5/8 转换为小数值,可以调用该函数:

>>> convert_fraction_to_decimal('5/8')
0.625
相关文章
|
4月前
|
Python
python保存两位小数的几种方法,python2保留小数
python保存两位小数的几种方法,python2保留小数
177 2
|
4月前
|
Python
Python计算误码率,输入是0-1比特流矩阵和小数矩阵
本文提供了一个Python函数calculate_ber,用于计算两个NumPy矩阵表示的二进制信号和接收信号之间的误码率(BER),其中包括信号与接收信号的比较、误差计数以及BER的计算过程,并给出了具体的使用示例。
83 2
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
56 2
|
2月前
|
算法 Python
【10月更文挑战第9天】「Mac上学Python 18」小学奥数篇4 - 分数加减法
本篇将通过 Python 和 Cangjie 双语解决简单的分数加减法问题,帮助学生理解分数的运算规则,并学会用编程解决数学计算问题。
76 1
|
2月前
|
索引 Python
Excel学习笔记(一):python读写excel,并完成计算平均成绩、成绩等级划分、每个同学分数大于70的次数、找最优成绩
这篇文章是关于如何使用Python读取Excel文件中的学生成绩数据,并进行计算平均成绩、成绩等级划分、统计分数大于70的次数以及找出最优成绩等操作的教程。
99 0
|
3月前
|
大数据 Python
6-11|Python中保证两位小数的方法
6-11|Python中保证两位小数的方法
|
4月前
|
存储 数据可视化 数据挖掘
【python】Python考研分数 线性回归模型预测(源码+论文)【独一无二】
【python】Python考研分数 线性回归模型预测(源码+论文)【独一无二】
|
7月前
|
数据可视化 大数据 数据处理
大数据处理时的python和R语言
【5月更文挑战第5天】本文讨论了在语言Python 和R中数据处理时的框架,比如Python中的 OpenCV, Matplotlib, NumPy, Pandas, 和Seaborn。
53 1
大数据处理时的python和R语言
|
6月前
|
Python
|
7月前
|
数据采集 数据挖掘 测试技术
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析