在R中转换单位

时间:2011-08-27 13:14:27

标签: r units-of-measurement

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

如果目前还没有这样做,我该如何创建一个包?

5 个答案:

答案 0 :(得分:24)

单位的性质可能会影响是否存在。总的来说,我认为,不幸的是,@ 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在回答类似问题时提到了“电介质”包装: Link to 'constants' help page in package 'dielectric'

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

更新:Gabor Grothendieck在2012年7月23日的一个类似问题中提到了'udunits2'软件包。它似乎需要安装一个独立的OS专用软件包。如果没有这样的安装,您将收到一条相当无用的错误消息:

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

答案 1 :(得分:10)

我知道这已经很晚了,但是measurements包有一个函数conv_unit(),可能就是你要找的东西。您输入您拥有的英制值,您要转换的单位(例如' ft')以及您要转换的内容(例如' km')。它有各种不同的尺寸(不仅仅是长度)。

答案 2 :(得分:7)

网格包中有unit()convertUnit()个功能,用于指定不同的长度和尺寸单位。这可能会做你想要的,或者如果没有,你就可以开始。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

有一个" new"今天称为单位的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