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
相关文章
|
14天前
|
数据采集 数据挖掘 测试技术
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
|
19天前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
【4月更文挑战第25天】R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
|
20天前
|
数据可视化 Python
R语言和Python对copula模型Gaussian、t、Clayton 和Gumbel族可视化理论概念和文献计量使用情况
R语言和Python对copula模型Gaussian、t、Clayton 和Gumbel族可视化理论概念和文献计量使用情况
|
26天前
|
存储 算法 数据挖掘
R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列
R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列
|
27天前
|
存储 数据可视化 vr&ar
【视频】Python和R语言使用指数加权平均(EWMA),ARIMA自回归移动平均模型预测时间序列
【视频】Python和R语言使用指数加权平均(EWMA),ARIMA自回归移动平均模型预测时间序列
|
28天前
R语言小数定律的保险业应用:泊松分布模拟索赔次数
R语言小数定律的保险业应用:泊松分布模拟索赔次数
|
29天前
|
算法 数据可视化 数据挖掘
用R语言和python进行社交网络中的社区检测
用R语言和python进行社交网络中的社区检测https://ucc.alicdn.com/pic/developer-ecology/4as3qn2go3ure_f4b58eedb2f849418cedab74ed3c856a.png
|
9月前
|
算法 数据处理 数据库
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
|
12月前
|
Python
一日一技:在Python里面做分数的运算
一日一技:在Python里面做分数的运算
98 0
|
3天前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化