我想在R中将英制单位转换为公制单位,反之亦然。我该如何做呢?
如果目前还没有这样做,我该如何创建一个包?
答案 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