在 R 中转换单位

Posted

技术标签:

【中文标题】在 R 中转换单位【英文标题】:Converting units in R 【发布时间】:2011-11-05 02:23:11 【问题描述】:

我想在 R 中将英制单位转换为公制单位,反之亦然。我该怎么做?

如果目前没有这样做的方法,我该如何创建一个可以这样做的包?

【问题讨论】:

your_matrix * your_conversion_factor,这个不需要包。 RcppGSLRcppArmadillo 是两个 R 包,与提供物理常量的外部库接口。 @baptiste 您能否更具体地了解这些 Rcpp* 包提供的功能/特性? @David 在他们各自网页的文档中:Armadillo 和 GSL。 Rcpp* 包提供从 R 访问这些库的权限。 转换物理单位很棘手。我写了unit conversion library in Ruby,所以我知道你必须分别处理尺寸、数量和单位、前缀和缩写、数量的首选单位等。这并不简单。 【参考方案1】:

编辑:现在有一个百科全书单元包:NISTunits

单位的性质可能会影响存在或不存在。总的来说,不幸的是,我认为@gsk3 是正确的。 'Hmisc'、'gdata' 和 'marelac' 包中有一些功能:

设置单位属性(不仅仅是时间对象): http://finzi.psych.upenn.edu/R/library/Hmisc/html/units.html

医疗: http://finzi.psych.upenn.edu/R/library/gdata/html/ConvertMedUnits.html

'marelac' 索引(主要针对海洋学) http://finzi.psych.upenn.edu/R/library/marelac/html/00Index.html

温度: http://finzi.psych.upenn.edu/R/library/marelac/html/convert_T.html

气压: http://finzi.psych.upenn.edu/R/library/marelac/html/convert_p.html

@Brian Diggs 在回答类似问题时提到了“dielectric”包: Link to 'constants' help page in package 'dielectric'

我认为这些将提供这样做的示例,并且函数 package.skeleton 应该有助于创建包的机制。我认为该软件包将是一个受欢迎的补充。

更新:Gabor Grothendieck 在 2012 年 7 月 23 日与 rhelp 类似的问题中提到了“udunits2”包。它似乎需要安装同名的独立操作系统特定包。如果没有这样的安装,您会收到一条非常无用的错误消息:

> ud.convert(1, "miles", "km")  
Error in ud.convert(x, "miles", "km") : 
  Units miles and km are not convertible

【讨论】:

这是一个有用的列表。像往常一样,我尝试了library(sos); findFn("unit conversion")。我以为ConvertMedUnits 回答了这个问题,然后我才意识到它是针对医疗单位的…… udunits2 包(和底层软件)真的很强大;在 ubuntu 上,可以使用 sudo apt-get install udunits-bin libudunits2-dev 安装包依赖项。然后你可以做ud.convert(1, "miles/hr", "km/s")甚至ud.convert(1, "Mg/ha/yr", "kg/m2/d")之类的事情,它有一个庞大的单位同义词数据库。 我已经安装了这个包,到 2013 年我不需要任何独立的应用程序来使用这个功能。【参考方案2】:

我知道这已经很晚了,但是包 measurements 有一个函数 conv_unit() 可能是您正在寻找的。您输入您所拥有的英制值、要转换的单位(例如“ft”)以及要转换为的单位(例如“km”)。它有多种不同的尺寸(不仅仅是长度)。

【讨论】:

【参考方案3】:

grid 包中有unit()convertUnit() 函数用于指定不同的长度和尺寸单位。这可能会做你想做的事,或者如果没有的话,会给你一个开始的地方。

【讨论】:

看起来grid package 已归档 @David,grid 包不再在 CRAN 上,因为它现在是随 R 一起安装的包之一,无需从 CRAN 单独下载。 @GregSnow 是这样吗?如果不加载任何包,我看不到 unitconvertUnit @MichaelChirico,安装包和加载包是有区别的。是的,你仍然需要加载 grid 包来使用 unit 和 convertUnit,但是你不需要从 R 中单独安装 grid 包。【参考方案4】:

udunits2 包就是这样做的。它包裹了强大的UDUNITS library:

udunits2::ud.convert(1, "mi", "km")
## [1] 1.609344

最重要的是,units 包(正在进行中)旨在提供一个类型安全的系统来进行单位算术运算:

with(ud_units, 1 * mi + 2 * km)
## 2.242742 mi
with(ud_units, 100 * km / (2 * h))
## 50 km/h
with(ud_units, 1 * mi + 2 * lb)
## Error: cannot convert lb into mi

【讨论】:

【参考方案5】:

今天有一个名为 units 的“新”R 包,它建立在不久前可用的 udunits2 R 包之上。

看看:https://cran.r-project.org/web/packages/units/vignettes/units.html#setting-units-unit-conversion

library(units)
(spd1 = 1:5 * with(ud_units, m/s))
##Units: m/s
##[1] 1 2 3 4 5

(spd2 = 1:5 * with(ud_units, km/h))
#Units: km/h
#[1] 1 2 3 4 5

spd1 + spd2                   # automatic conversion
#Units: m/s
#[1] 1.277778 2.555556 3.833333 5.111111 6.388889

spd1 * spd2                   # unit derivation
#Units: km*m/h/s
#[1]  1  4  9 16 25

spd1 * 10 * with(ud_units, s) # unit simplification
#Units: m
#[1] 10 20 30 40 50

spd1 + 10 * with(ud_units, s) # error checking
#Error in `units<-.units`(`*tmp*`, value = list(numerator = "m", denominator = "s")) : 
cannot convert s into m/s

【讨论】:

这变得更好了:spd2 = 1:5 %&gt;% set_units(mile),然后spd2 %&gt;% set_units(km) 结果:Units: [km] [1] 1.609344 3.218688 4.828032 6.437376 8.046720

以上是关于在 R 中转换单位的主要内容,如果未能解决你的问题,请参考以下文章

单位px 转换成 rem

R - 标准化矩阵以具有单位对角线

R 添加到 difftime 向量会忘记单位

Firefox 中“0”转换的单位

价格列表如何设置计量单位转换

PCB 单位