2013-03-18 31 views
6

Dưới đây là một đoạn trích của ma trận số mà tôi cóScaling một ma trận số trong R với giá trị 0-1

[1,] 30 -33.129487 3894754.1 -39.701738 -38.356477 -34.220534 
[2,] 29 -44.289487 -8217525.9 -44.801738 -47.946477 -41.020534 
[3,] 28 -48.439487 -4572815.9 -49.181738 -48.086477 -46.110534 
[4,] 27 -48.359487 -2454575.9 -42.031738 -43.706477 -43.900534 
[5,] 26 -38.919487 -2157535.9 -47.881738 -43.576477 -46.330534 
[6,] 25 -45.069487 -5122485.9 -47.831738 -47.156477 -42.860534 
[7,] 24 -46.207487 -2336325.9 -53.131738 -50.576477 -50.410534 
[8,] 23 -51.127487 -2637685.9 -43.121738 -47.336477 -47.040534 
[9,] 22 -45.645487 3700424.1 -56.151738 -47.396477 -50.720534 
[10,] 21 -56.739487 1572594.1 -49.831738 -54.386577 -52.470534 
[11,] 20 -46.319487 642214.1 -39.631738 -44.406577 -41.490534 

Những gì tôi muốn làm bây giờ, là để mở rộng các giá trị cho mỗi cột có giá trị từ 0 đến 1.

tôi cố gắng để thực hiện điều này bằng cách sử dụng chức năng scale() trên ma trận của tôi (các thông số mặc định), và tôi đã nhận này

[1,] -0.88123100 0.53812440 -1.05963281 -1.031191482 -0.92872324 
[2,] -1.17808251 -1.13538649 -1.19575096 -1.289013031 -1.11327085 
[3,] -1.28847084 -0.63180980 -1.31265244 -1.292776849 -1.25141017 
[4,] -1.28634287 -0.33914007 -1.12182012 -1.175023107 -1.19143220 
[5,] -1.03524267 -0.29809911 -1.27795565 -1.171528133 -1.25738083 
[6,] -1.19883019 -0.70775576 -1.27662116 -1.267774342 -1.16320727 
[7,] -1.22910054 -0.32280189 -1.41807728 -1.359719044 -1.36810940 
[8,] -1.35997055 -0.36443973 -1.15091204 -1.272613537 -1.27664977 
[9,] -1.21415156 0.51127451 -1.49868058 -1.274226602 -1.37652260 
[10,] -1.50924749 0.21727976 -1.33000083 -1.462151358 -1.42401647 
[11,] -1.23207969 0.08873245 -1.05776452 -1.193844887 -1.12602635 

Đó là đã gần với những gì tôi muốn, nhưng giá trị từ 0: 1 thậm chí còn tốt hơn. Tôi đọc hướng dẫn trợ giúp của scale(), nhưng tôi thực sự không hiểu làm thế nào tôi sẽ làm điều đó.

Trả lời

17

Hãy thử những điều sau đây, trong đó có vẻ đơn giản đủ:

## Data to make a minimal reproducible example 
m <- matrix(rnorm(9), ncol=3) 

## Rescale each column to range between 0 and 1 
apply(m, MARGIN = 2, FUN = function(X) (X - min(X))/diff(range(X))) 
#   [,1]  [,2]  [,3] 
# [1,] 0.0000000 0.0000000 0.5220198 
# [2,] 0.6239273 1.0000000 0.0000000 
# [3,] 1.0000000 0.9253893 1.0000000 
+1

Điều này thực sự hữu ích, cảm ơn! Tôi chỉ còn một câu hỏi: "2" làm gì trong hàm áp dụng? –

+1

@bluewoodtree - nó cho 'scale()' áp dụng các hàm cho các cột (vì các cột được biểu diễn dưới dạng chỉ mục thứ hai, 'j', trong' m [i, j] '). Đặt 'MARGIN = 1' sẽ rescale ma trận hàng khôn ngoan thay vì cột khôn ngoan. –

+0

okay, figured it out, 2 là để áp dụng nó vào các cột –

18

Và nếu bạn vẫn còn sử dụng scale:

maxs <- apply(a, 2, max) 
mins <- apply(a, 2, min) 
scale(a, center = mins, scale = maxs - mins) 
+2

và những gì nếu tôi muốn mở rộng quy mô giữa -1-1? –

+1

@DarwinPC, cho -1 đến 1, thử tỷ lệ (a, center = (maxs + mins)/2, scale = (maxs-mins)/2) – gchaks

1

Cài đặt theo cụm Sim gói và chạy sau:

normX = data.Normalization(x,type="n4"); 
0

Không phải là đẹp nhất nhưng điều này chỉ có công việc làm, kể từ khi tôi cần phải làm điều này trong một khung dữ liệu.

column_zero_one_range_scale <- function(
input_df, 
columns_to_scale #columns in input_df to scale, must be numeric 
){ 

input_df_replace <- input_df 

columncount <- length(columns_to_scale) 
for(i in 1:columncount){ 

columnnum <- columns_to_scale[i] 

if(class(input_df[,columnnum]) !='numeric' & class(input_df[,columnnum])!='integer') 
    {print(paste('Column name ',colnames(input_df)[columnnum],' not an integer or numeric, will skip',sep='')) } 


if(class(input_df[,columnnum]) %in% c('numeric','integer')) 
{ 
    vec <- input_df[,columnnum] 
    rangevec <- max(vec,na.rm=T)-min(vec,na.rm=T) 
    vec1 <- vec - min(vec,na.rm=T) 
    vec2 <- vec1/rangevec 
} 
input_df_replace[,columnnum] <- vec2 
colnames(input_df_replace)[columnnum] <- paste(colnames(input_df)[columnnum],'_scaled') 

} 

return(input_df_replace) 


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