2017-10-25 14 views
6

Sử dụng gói units tôi có thể tạo ra một vector với các đơn vị vật lý, ví dụ:Loại bỏ các đơn vị từ một vector R

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 

nhưng làm thế nào để tôi lấy lại cho một vector R đơn giản mà không đơn vị?

unclass(a) làm hầu hết công việc, nhưng để lại một loạt các thuộc tính trong vector:

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" 

nhưng tôi cảm thấy cần phải có một cách đơn giản hơn. Chỉ định là unitless không giúp ích gì, nó tạo ra một véc tơ với các đơn vị "đơn vị".

Không có gì trong những họa tiết hoặc ...

+9

'as.vector (a) '? – Sotos

+2

Liên kết cũng như vậy: http://r.789695.n4.nabble.com/function-to-remove-attributes-td914615.html Vì vậy, một thay thế là 'thuộc tính (a) = NULL', mặc dù'? As. vector' cho thấy nó khá đặc biệt cho mục đích này – MichaelChirico

+1

'as.integer' cũng nên làm –

Trả lời

2

Bạn có thể sử dụng as.vector :)

hoặc là nhiều hơn chung:

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 
+0

Ah, vì ma trận cũng có thể có đơn vị. – Spacedman

1

as.vector nên làm việc trong trường hợp này:


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 
0

Tôi đoán as.vector có thể được thực hiện để làm việc với ma trận quá

#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" 
+0

Vấn đề là nó loại bỏ đối tượng thuộc tính của nó có thể đã được thêm vào trước hoặc sau khi chuyển đổi đơn vị và các lớp bổ sung tiềm năng, không thể thêm trước khi chuyển đổi ('set_units' không thích nó) nhưng có thể được thêm vào sau đó. –

Các vấn đề liên quan