在 R 中转换单位
Posted
技术标签:
【中文标题】在 R 中转换单位【英文标题】:Converting units in R 【发布时间】:2011-11-05 02:23:11 【问题描述】:我想在 R 中将英制单位转换为公制单位,反之亦然。我该怎么做?
如果目前没有这样做的方法,我该如何创建一个可以这样做的包?
【问题讨论】:
your_matrix * your_conversion_factor,这个不需要包。RcppGSL
和 RcppArmadillo
是两个 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 是这样吗?如果不加载任何包,我看不到 unit
或 convertUnit
@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 %>% set_units(mile)
,然后spd2 %>% set_units(km)
结果:Units: [km] [1] 1.609344 3.218688 4.828032 6.437376 8.046720
以上是关于在 R 中转换单位的主要内容,如果未能解决你的问题,请参考以下文章