从R向量中删除单位

10
使用units软件包,我可以创建一个带有物理单位的向量,例如:
library(units)
a = 1:10
units(a) <- with(ud_units, m/s) 
a
## Units: m/s
##  [1]  1  2  3  4  5  6  7  8  9 10

但是我如何将带有单位的向量转换为不带单位的普通R向量呢?

unclass(a)可以完成大部分工作,但是会在向量中留下许多属性:

unclass(a)
## [1]  1  2  3  4  5  6  7  8  9 10
## attr(,"units")
## $numerator
## [1] "m"
##
## $denominator
## [1] "s"
##
## attr(,"class")
## [1] "symbolic_units"

但我觉得应该有一种更简单的方法。将其指定为无单位并不能帮助,它会创建一个具有“无单位”单位的向量。

在文档中也没有找到相关内容...


9
as.vector(a)的意思是将对象a转化为一个向量。 - Sotos
3
还要将此链接与之关联:http://r.789695.n4.nabble.com/function-to-remove-attributes-td914615.html因此,另一个选择是 attributes(a) = NULL,尽管 ?as.vector 表明它相当专门地用于这个目的。 - MichaelChirico
1
as.integer 应该也可以。 - David Arenburg
我稍微找了一下关于“如何删除属性Q”的官方指南,但是没有找到。虽然我之前也有过这个问题(不确定是否解决了)。 - MichaelChirico
第一个把as.vector作为答案提交的人将获得积分。 - Spacedman
4个回答

8

你可以使用 as.vector

或者更一般的说:

clean_units <- function(x){
  attr(x,"units") <- NULL
  class(x) <- setdiff(class(x),"units")
  x
}

a <- clean_units(a)
# [1]  1  2  3  4  5  6  7  8  9 10
str(a)
# int [1:10] 1 2 3 4 5 6 7 8 9 10

3

as.vector在这种情况下应该可以使用:


library(units)                 
a = 1:10                       
units(a) <- with(ud_units, m/s)
a                              
#> Units: m/s
#>  [1]  1  2  3  4  5  6  7  8  9 10
str(a)                         
#> Class 'units'  atomic [1:10] 1 2 3 4 5 6 7 8 9 10
#>   ..- attr(*, "units")=List of 2
#>   .. ..$ numerator  : chr "m"
#>   .. ..$ denominator: chr "s"
#>   .. ..- attr(*, "class")= chr "symbolic_units"

b = as.vector(a)               
str(b)                         
#>  int [1:10] 1 2 3 4 5 6 7 8 9 10

2
请注意,现在有一个名为drop_units的函数,使这一过程变得更加简单和直观:
library(units)
#> udunits database from /usr/share/xml/udunits/udunits2.xml
a = set_units(1:10,'m/s')
a
#> Units: [m/s]
#>  [1]  1  2  3  4  5  6  7  8  9 10
drop_units(a)
#>  [1]  1  2  3  4  5  6  7  8  9 10

创建于2021年9月28日,使用reprex包(v2.0.1)


0

我想 as.vector 也可以用于矩阵

#DATA
set.seed(42)
m = set_units(matrix(rnorm(4), 2), m/s)
m
#Units: m/s
#           [,1]      [,2]
#[1,]  1.3709584 0.3631284
#[2,] -0.5646982 0.6328626

class(m)
#[1] "units"

foo = function(x){
    y = as.vector(x)
    dim(y) = dim(x)
    return(y)
}

foo(m)
#           [,1]      [,2]
#[1,]  1.3709584 0.3631284
#[2,] -0.5646982 0.6328626

class(foo(m))
#[1] "matrix"

foo(a)
# [1]  1  2  3  4  5  6  7  8  9 10

class(foo(a))
#[1] "integer"

问题在于它会剥夺对象的属性,这些属性可能在单位转换之前或之后被添加,并且还会剥夺潜在的附加类,这些类不能在转换之前添加(set_units 不支持),但可以在之后添加。 - moodymudskipper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接